Merge "Adding proxy override to test app" into androidx-master-dev
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index ec1b1c5..7fbba4c 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -79,31 +79,6 @@
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
- <Objective-C-extensions>
- <file>
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
- </file>
- <class>
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
- </class>
- <extensions>
- <pair source="cpp" header="h" fileNamingConvention="NONE" />
- <pair source="c" header="h" fileNamingConvention="NONE" />
- </extensions>
- </Objective-C-extensions>
<XML>
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
diff --git a/activity/api/1.0.0-alpha05.txt b/activity/api/1.0.0-alpha05.txt
index 6907f23..1d5064e 100644
--- a/activity/api/1.0.0-alpha05.txt
+++ b/activity/api/1.0.0-alpha05.txt
@@ -1,12 +1,13 @@
// Signature format: 3.0
package androidx.activity {
- public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.savedstate.bundle.BundleSavedStateRegistryOwner androidx.lifecycle.LifecycleOwner androidx.lifecycle.ViewModelStoreOwner {
+ public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
ctor public ComponentActivity();
method public void addOnBackPressedCallback(androidx.activity.OnBackPressedCallback);
method public void addOnBackPressedCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.OnBackPressedCallback);
- method public final androidx.savedstate.SavedStateRegistry<android.os.Bundle> getBundleSavedStateRegistry();
method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public androidx.lifecycle.ViewModelStore getViewModelStore();
method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
method public final Object? onRetainNonConfigurationInstance();
diff --git a/activity/api/current.txt b/activity/api/current.txt
index 6907f23..1d5064e 100644
--- a/activity/api/current.txt
+++ b/activity/api/current.txt
@@ -1,12 +1,13 @@
// Signature format: 3.0
package androidx.activity {
- public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.savedstate.bundle.BundleSavedStateRegistryOwner androidx.lifecycle.LifecycleOwner androidx.lifecycle.ViewModelStoreOwner {
+ public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
ctor public ComponentActivity();
method public void addOnBackPressedCallback(androidx.activity.OnBackPressedCallback);
method public void addOnBackPressedCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.OnBackPressedCallback);
- method public final androidx.savedstate.SavedStateRegistry<android.os.Bundle> getBundleSavedStateRegistry();
method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public androidx.lifecycle.ViewModelStore getViewModelStore();
method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
method public final Object? onRetainNonConfigurationInstance();
diff --git a/activity/build.gradle b/activity/build.gradle
index a2fd3cb..f687bc8 100644
--- a/activity/build.gradle
+++ b/activity/build.gradle
@@ -15,13 +15,13 @@
dependencies {
api(project(":annotation"))
- api("androidx.core:core:1.0.0") {
+ api(project(":core")) {
exclude group: 'androidx.annotation'
exclude group: 'com.google.guava', module: 'listenablefuture'
}
- api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
+ api(project(":lifecycle:lifecycle-runtime"), libs.exclude_annotations_transitive)
api(project(":lifecycle:lifecycle-viewmodel"), libs.exclude_annotations_transitive)
- api(project(":savedstate:savedstate-bundle"))
+ api(project(":savedstate"))
androidTestImplementation(KOTLIN_STDLIB)
androidTestImplementation(TEST_EXT_JUNIT)
diff --git a/activity/src/androidTest/java/androidx/activity/ComponentActivitySavedStateTest.kt b/activity/src/androidTest/java/androidx/activity/ComponentActivitySavedStateTest.kt
index a46b155..3c2c78a 100644
--- a/activity/src/androidTest/java/androidx/activity/ComponentActivitySavedStateTest.kt
+++ b/activity/src/androidTest/java/androidx/activity/ComponentActivitySavedStateTest.kt
@@ -47,7 +47,7 @@
val activity = activityRule.activity
activityRule.runOnUiThread {
assertThat(activity.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)).isTrue()
- val registry = activity.bundleSavedStateRegistry
+ val registry = activity.savedStateRegistry
val savedState = registry.consumeRestoredStateForKey(CALLBACK_KEY)
assertThat(savedState).isNull()
registry.registerSavedStateProvider(CALLBACK_KEY, DefaultProvider())
@@ -62,7 +62,7 @@
val recreated = recreateActivity(activityRule)
activityRule.runOnUiThread {
assertThat(recreated.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)).isTrue()
- checkDefaultSavedState(recreated.bundleSavedStateRegistry)
+ checkDefaultSavedState(recreated.savedStateRegistry)
}
}
@@ -75,7 +75,7 @@
recreated.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
- checkDefaultSavedState(recreated.bundleSavedStateRegistry)
+ checkDefaultSavedState(recreated.savedStateRegistry)
}
})
}
@@ -90,7 +90,7 @@
}
}
-private class DefaultProvider : SavedStateRegistry.SavedStateProvider<Bundle> {
+private class DefaultProvider : SavedStateRegistry.SavedStateProvider {
override fun saveState() = Bundle().apply { putString(KEY, VALUE) }
}
@@ -98,7 +98,7 @@
private const val VALUE = "value"
private const val CALLBACK_KEY = "foo"
-private fun checkDefaultSavedState(store: SavedStateRegistry<Bundle>) {
+private fun checkDefaultSavedState(store: SavedStateRegistry) {
val savedState = store.consumeRestoredStateForKey(CALLBACK_KEY)
assertThat(savedState).isNotNull()
assertThat(savedState!!.getString(KEY)).isEqualTo(VALUE)
@@ -109,7 +109,7 @@
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (checkEnabledInOnCreate) {
- checkDefaultSavedState(bundleSavedStateRegistry)
+ checkDefaultSavedState(savedStateRegistry)
checkEnabledInOnCreate = false
}
}
diff --git a/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/src/main/java/androidx/activity/ComponentActivity.java
index 237a421..0fe9de7 100644
--- a/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -18,7 +18,6 @@
import static android.os.Build.VERSION.SDK_INT;
-import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
@@ -36,9 +35,10 @@
import androidx.lifecycle.ViewModelStore;
import androidx.lifecycle.ViewModelStoreOwner;
import androidx.savedstate.SavedStateRegistry;
-import androidx.savedstate.bundle.BundleSavedStateRegistry;
-import androidx.savedstate.bundle.BundleSavedStateRegistryOwner;
+import androidx.savedstate.SavedStateRegistryController;
+import androidx.savedstate.SavedStateRegistryOwner;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -49,11 +49,10 @@
* lower level building blocks are included. Higher level components can then be used as needed
* without enforcing a deep Activity class hierarchy or strong coupling between components.
*/
-@SuppressLint("RestrictedApi")
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
- BundleSavedStateRegistryOwner {
+ SavedStateRegistryOwner {
static final class NonConfigurationInstances {
Object custom;
@@ -61,7 +60,8 @@
}
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
- private final BundleSavedStateRegistry mSavedStateRegistry = new BundleSavedStateRegistry();
+ private final SavedStateRegistryController mSavedStateRegistryController =
+ new SavedStateRegistryController();
// Lazily recreated from NonConfigurationInstances by getViewModelStore()
private ViewModelStore mViewModelStore;
@@ -70,7 +70,9 @@
final CopyOnWriteArrayList<LifecycleAwareOnBackPressedCallback> mOnBackPressedCallbacks =
new CopyOnWriteArrayList<>();
- @SuppressLint("RestrictedApi")
+ // Cache the ContentView layoutIds for Activities.
+ private static final HashMap<Class, Integer> sAnnotationIds = new HashMap<>();
+
public ComponentActivity() {
Lifecycle lifecycle = getLifecycle();
//noinspection ConstantConditions
@@ -117,21 +119,25 @@
* call {@link #setContentView(int)} for you.
*/
@Override
- @SuppressWarnings("RestrictedApi")
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mSavedStateRegistry.performRestore(savedInstanceState);
+ mSavedStateRegistryController.performRestore(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
- ContentView annotation = getClass().getAnnotation(ContentView.class);
- if (annotation != null) {
- int layoutId = annotation.value();
- if (layoutId != 0) {
- setContentView(layoutId);
+ Class<? extends ComponentActivity> clazz = getClass();
+ if (!sAnnotationIds.containsKey(clazz)) {
+ ContentView annotation = clazz.getAnnotation(ContentView.class);
+ if (annotation != null) {
+ sAnnotationIds.put(clazz, annotation.value());
+ } else {
+ sAnnotationIds.put(clazz, null);
}
}
+ Integer layoutId = sAnnotationIds.get(clazz);
+ if (layoutId != null && layoutId != 0) {
+ setContentView(layoutId);
+ }
}
- @SuppressLint("RestrictedApi")
@CallSuper
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
@@ -140,7 +146,7 @@
((LifecycleRegistry) lifecycle).markState(Lifecycle.State.CREATED);
}
super.onSaveInstanceState(outState);
- mSavedStateRegistry.performSave(outState);
+ mSavedStateRegistryController.performSave(outState);
}
/**
@@ -359,11 +365,10 @@
@NonNull
@Override
- public final SavedStateRegistry<Bundle> getBundleSavedStateRegistry() {
- return mSavedStateRegistry;
+ public final SavedStateRegistry getSavedStateRegistry() {
+ return mSavedStateRegistryController.getSavedStateRegistry();
}
- @SuppressLint("RestrictedApi")
private class LifecycleAwareOnBackPressedCallback implements
OnBackPressedCallback,
GenericLifecycleObserver {
diff --git a/activity/src/main/java/androidx/activity/ImmLeaksCleaner.java b/activity/src/main/java/androidx/activity/ImmLeaksCleaner.java
index 3a63924..3b6feb5 100644
--- a/activity/src/main/java/androidx/activity/ImmLeaksCleaner.java
+++ b/activity/src/main/java/androidx/activity/ImmLeaksCleaner.java
@@ -16,7 +16,6 @@
package androidx.activity;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.View;
@@ -31,7 +30,6 @@
import java.lang.reflect.Field;
@RequiresApi(19)
-@SuppressLint("RestrictedApi")
final class ImmLeaksCleaner implements GenericLifecycleObserver {
private static final int NOT_INITIALIAZED = 0;
private static final int INIT_SUCCESS = 1;
diff --git a/annotations/api/1.1.0-alpha02.txt b/annotations/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..d66f9f5
--- /dev/null
+++ b/annotations/api/1.1.0-alpha02.txt
@@ -0,0 +1,217 @@
+// Signature format: 3.0
+package androidx.annotation {
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimatorRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnyRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface AnyThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ArrayRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AttrRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface BinderThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface BoolRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CallSuper {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CheckResult {
+ method public abstract String suggest() default "";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorLong {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ColorRes {
+ }
+
+ @java.lang.annotation.Inherited @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public @interface ContentView {
+ method @LayoutRes public abstract int value();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Dimension {
+ method @DimensionUnit public abstract int unit() default androidx.annotation.Dimension.PX;
+ field public static final int DP = 0; // 0x0
+ field public static final int PX = 1; // 0x1
+ field public static final int SP = 2; // 0x2
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
+ method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+ method public abstract boolean fromInclusive() default true;
+ method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+ method public abstract boolean toInclusive() default true;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FontRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FractionRes {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface GuardedBy {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface HalfFloat {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IdRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract int[] value() default {};
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntRange {
+ method public abstract long from() default java.lang.Long.MIN_VALUE;
+ method public abstract long to() default java.lang.Long.MAX_VALUE;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IntegerRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface Keep {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface LayoutRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface LongDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract long[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface MainThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface MenuRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface NavigationRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface NonNull {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
+ }
+
+ @Dimension(unit=androidx.annotation.Dimension.PX) @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface Px {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface RawRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RequiresApi {
+ method @IntRange(from=1) public abstract int api() default 1;
+ method @IntRange(from=1) public abstract int value() default 1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface RequiresFeature {
+ method public abstract String enforcement();
+ method public abstract String name();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) public @interface RequiresPermission {
+ method public abstract String[] allOf() default {};
+ method public abstract String[] anyOf() default {};
+ method public abstract boolean conditional() default false;
+ method public abstract String value() default "";
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface RequiresPermission.Read {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface RequiresPermission.Write {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+ method public abstract androidx.annotation.RestrictTo.Scope[] value();
+ }
+
+ public enum RestrictTo.Scope {
+ enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
+ method public abstract long max() default java.lang.Long.MAX_VALUE;
+ method public abstract long min() default java.lang.Long.MIN_VALUE;
+ method public abstract long multiple() default 1;
+ method public abstract long value() default -1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface StringDef {
+ method public abstract boolean open() default false;
+ method public abstract String[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StringRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface TransitionRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface UiThread {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface VisibleForTesting {
+ method @ProductionVisibility public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+ field public static final int NONE = 5; // 0x5
+ field public static final int PACKAGE_PRIVATE = 3; // 0x3
+ field public static final int PRIVATE = 2; // 0x2
+ field public static final int PROTECTED = 4; // 0x4
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface WorkerThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface XmlRes {
+ }
+
+}
+
diff --git a/annotations/src/main/java/androidx/annotation/RestrictTo.java b/annotations/src/main/java/androidx/annotation/RestrictTo.java
index ef7b243..98b9093 100644
--- a/annotations/src/main/java/androidx/annotation/RestrictTo.java
+++ b/annotations/src/main/java/androidx/annotation/RestrictTo.java
@@ -84,9 +84,9 @@
/**
* Restrict usage to code within the same group ID (based on gradle
- * group ID). This is an alias for {@link #LIBRARY_GROUP}.
+ * group ID). This is an alias for {@link #LIBRARY_GROUP_PREFIX}.
*
- * @deprecated Use {@link #LIBRARY_GROUP} instead
+ * @deprecated Use {@link #LIBRARY_GROUP_PREFIX} instead
*/
@Deprecated
GROUP_ID,
diff --git a/appcompat/api/1.1.0-alpha03.txt b/appcompat/api/1.1.0-alpha03.txt
index 19ac0fb..973d64c 100644
--- a/appcompat/api/1.1.0-alpha03.txt
+++ b/appcompat/api/1.1.0-alpha03.txt
@@ -252,9 +252,10 @@
public abstract class AppCompatDelegate {
method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
method public abstract boolean applyDayNight();
- method public static androidx.appcompat.app.AppCompatDelegate! create(android.app.Activity!, androidx.appcompat.app.AppCompatCallback!);
- method public static androidx.appcompat.app.AppCompatDelegate! create(android.app.Dialog!, androidx.appcompat.app.AppCompatCallback!);
- method public static androidx.appcompat.app.AppCompatDelegate! create(android.content.Context!, android.view.Window!, androidx.appcompat.app.AppCompatCallback!);
+ method public void attachBaseContext(android.content.Context!);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
method public static int getDefaultNightMode();
@@ -469,11 +470,11 @@
ctor public AppCompatAutoCompleteTextView(android.content.Context!);
ctor public AppCompatAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -481,14 +482,14 @@
ctor public AppCompatButton(android.content.Context!);
ctor public AppCompatButton(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatButton(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
method public void setSupportAllCaps(boolean);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -496,15 +497,15 @@
ctor public AppCompatCheckBox(android.content.Context!);
ctor public AppCompatCheckBox(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatCheckBox(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportButtonTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
@@ -518,11 +519,11 @@
ctor public AppCompatEditText(android.content.Context!);
ctor public AppCompatEditText(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatEditText(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -530,41 +531,41 @@
ctor public AppCompatImageButton(android.content.Context!);
ctor public AppCompatImageButton(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatImageButton(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportImageTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
ctor public AppCompatImageView(android.content.Context!);
ctor public AppCompatImageView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatImageView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportImageTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!);
ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -572,15 +573,15 @@
ctor public AppCompatRadioButton(android.content.Context!);
ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportButtonTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatRatingBar extends android.widget.RatingBar {
@@ -602,30 +603,30 @@
ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int);
ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int, int);
ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int, int, android.content.res.Resources.Theme!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
ctor public AppCompatTextView(android.content.Context!);
ctor public AppCompatTextView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatTextView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>?);
method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
@@ -694,6 +695,7 @@
method public android.view.View? getAnchorView();
method @StyleRes public int getAnimationStyle();
method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
method public int getHeight();
method public int getHorizontalOffset();
method public int getInputMethodMode();
@@ -720,6 +722,7 @@
method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
method public void setContentWidth(int);
method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
method public void setHeight(int);
method public void setHorizontalOffset(int);
method public void setInputMethodMode(int);
diff --git a/appcompat/api/current.txt b/appcompat/api/current.txt
index 19ac0fb..973d64c 100644
--- a/appcompat/api/current.txt
+++ b/appcompat/api/current.txt
@@ -252,9 +252,10 @@
public abstract class AppCompatDelegate {
method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
method public abstract boolean applyDayNight();
- method public static androidx.appcompat.app.AppCompatDelegate! create(android.app.Activity!, androidx.appcompat.app.AppCompatCallback!);
- method public static androidx.appcompat.app.AppCompatDelegate! create(android.app.Dialog!, androidx.appcompat.app.AppCompatCallback!);
- method public static androidx.appcompat.app.AppCompatDelegate! create(android.content.Context!, android.view.Window!, androidx.appcompat.app.AppCompatCallback!);
+ method public void attachBaseContext(android.content.Context!);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
method public static int getDefaultNightMode();
@@ -469,11 +470,11 @@
ctor public AppCompatAutoCompleteTextView(android.content.Context!);
ctor public AppCompatAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -481,14 +482,14 @@
ctor public AppCompatButton(android.content.Context!);
ctor public AppCompatButton(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatButton(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
method public void setSupportAllCaps(boolean);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -496,15 +497,15 @@
ctor public AppCompatCheckBox(android.content.Context!);
ctor public AppCompatCheckBox(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatCheckBox(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportButtonTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
@@ -518,11 +519,11 @@
ctor public AppCompatEditText(android.content.Context!);
ctor public AppCompatEditText(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatEditText(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -530,41 +531,41 @@
ctor public AppCompatImageButton(android.content.Context!);
ctor public AppCompatImageButton(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatImageButton(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportImageTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
ctor public AppCompatImageView(android.content.Context!);
ctor public AppCompatImageView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatImageView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportImageTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!);
ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
}
@@ -572,15 +573,15 @@
ctor public AppCompatRadioButton(android.content.Context!);
ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportButtonTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatRatingBar extends android.widget.RatingBar {
@@ -602,30 +603,30 @@
ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int);
ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int, int);
ctor public AppCompatSpinner(android.content.Context!, android.util.AttributeSet!, int, int, android.content.res.Resources.Theme!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
}
public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
ctor public AppCompatTextView(android.content.Context!);
ctor public AppCompatTextView(android.content.Context!, android.util.AttributeSet!);
ctor public AppCompatTextView(android.content.Context!, android.util.AttributeSet!, int);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportBackgroundTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
method public void setTextAppearance(android.content.Context!, int);
method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>?);
method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
@@ -694,6 +695,7 @@
method public android.view.View? getAnchorView();
method @StyleRes public int getAnimationStyle();
method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
method public int getHeight();
method public int getHorizontalOffset();
method public int getInputMethodMode();
@@ -720,6 +722,7 @@
method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
method public void setContentWidth(int);
method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
method public void setHeight(int);
method public void setHorizontalOffset(int);
method public void setInputMethodMode(int);
diff --git a/appcompat/build.gradle b/appcompat/build.gradle
index 37533a6..1df21f3 100644
--- a/appcompat/build.gradle
+++ b/appcompat/build.gradle
@@ -11,7 +11,7 @@
api(project(":core"))
implementation(project(":collection"))
- api("androidx.cursoradapter:cursoradapter:1.0.0")
+ api(project(":cursoradapter"))
api(project(":fragment"))
api(project(":appcompat:appcompat-resources"))
api("androidx.drawerlayout:drawerlayout:1.0.0")
diff --git a/appcompat/res/values/attrs.xml b/appcompat/res/values/attrs.xml
index 3e9cb01..d4541f8 100644
--- a/appcompat/res/values/attrs.xml
+++ b/appcompat/res/values/attrs.xml
@@ -1034,6 +1034,8 @@
<!-- A color to apply to the subtitle string. -->
<attr name="subtitleTextColor" format="color" />
<attr name="android:minHeight" />
+ <!-- Menu resource to inflate to be shown in the toolbar -->
+ <attr name="menu" format="reference" />
</declare-styleable>
<declare-styleable name="PopupWindowBackgroundState">
diff --git a/appcompat/resources/src/androidTest/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompatTest.java b/appcompat/resources/src/androidTest/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompatTest.java
index 1cfe0e6..10c86dc 100644
--- a/appcompat/resources/src/androidTest/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompatTest.java
+++ b/appcompat/resources/src/androidTest/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompatTest.java
@@ -22,7 +22,6 @@
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
import android.content.Context;
import android.graphics.Canvas;
@@ -40,7 +39,6 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
@@ -79,11 +77,11 @@
// Expected.
}
- Drawable unfocused = mock(Drawable.class);
+ Drawable unfocused = new MockDrawable();
asld.addState(StateSet.WILD_CARD, unfocused, R.id.focused);
assertEquals(1, asld.getStateCount());
- Drawable focused = mock(Drawable.class);
+ Drawable focused = new MockDrawable();
asld.addState(STATE_FOCUSED, focused, R.id.unfocused);
assertEquals(2, asld.getStateCount());
}
@@ -92,8 +90,8 @@
public void testAddTransition() {
AnimatedStateListDrawableCompat asld = new AnimatedStateListDrawableCompat();
- Drawable focused = mock(Drawable.class);
- Drawable unfocused = mock(Drawable.class);
+ Drawable focused = new MockDrawable();
+ Drawable unfocused = new MockDrawable();
asld.addState(STATE_FOCUSED, focused, R.id.focused);
asld.addState(StateSet.WILD_CARD, unfocused, R.id.unfocused);
@@ -126,8 +124,8 @@
public void testOnStateChange() {
AnimatedStateListDrawableCompat asld = new AnimatedStateListDrawableCompat();
- Drawable focused = mock(Drawable.class);
- Drawable unfocused = mock(Drawable.class);
+ Drawable focused = new MockDrawable();
+ Drawable unfocused = new MockDrawable();
asld.addState(STATE_FOCUSED, focused, R.id.focused);
asld.addState(StateSet.WILD_CARD, unfocused, R.id.unfocused);
@@ -189,8 +187,8 @@
assertNotNull(asld.getConstantState());
// When a drawable who returns a null constant state is added
- Drawable noConstantStateDrawable = mock(Drawable.class);
- Mockito.when(noConstantStateDrawable.getConstantState()).thenReturn(null);
+ // MockDrawable returns null from getConstantState() - same as Drawable's default impl
+ Drawable noConstantStateDrawable = new MockDrawable();
asld.addState(StateSet.WILD_CARD, noConstantStateDrawable, R.id.focused);
// Then the ASLD should also return a null constant state
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java
index fbbea57..d3c9b9a 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java
@@ -18,7 +18,7 @@
import static android.os.Build.VERSION_CODES.LOLLIPOP;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
@@ -51,7 +51,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class DrawableContainer extends Drawable implements Drawable.Callback {
private static final boolean DEBUG = false;
private static final String TAG = "DrawableContainer";
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java
index 17bdb26..9ac8845 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java
@@ -16,6 +16,8 @@
package androidx.appcompat.graphics.drawable;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
@@ -28,9 +30,6 @@
import androidx.annotation.RestrictTo;
import androidx.core.graphics.drawable.DrawableCompat;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
/**
* Drawable which delegates all calls to its wrapped {@link Drawable}.
* <p>
@@ -39,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class DrawableWrapper extends Drawable implements Drawable.Callback {
private Drawable mDrawable;
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawable.java b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawable.java
index 3221e00..65a3878 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawable.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawable.java
@@ -19,7 +19,7 @@
import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.content.res.TypedArrayUtils.obtainAttributes;
import android.content.Context;
@@ -35,8 +35,8 @@
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.appcompat.resources.R;
-
import androidx.appcompat.widget.ResourceManagerInternal;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -75,7 +75,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class StateListDrawable extends DrawableContainer {
private static final String TAG = "StateListDrawable";
private static final boolean DEBUG = false;
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java b/appcompat/resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
index 25b58f2..58b1d10 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
@@ -16,6 +16,8 @@
package androidx.appcompat.widget;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -27,19 +29,16 @@
import android.os.Build;
import android.util.Log;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.graphics.drawable.WrappedDrawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
/** @hide */
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class DrawableUtils {
private static final int[] CHECKED_STATE_SET = new int[]{android.R.attr.state_checked};
private static final int[] EMPTY_STATE_SET = new int[0];
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java b/appcompat/resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
index a2f3de4..cb58acd 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -39,13 +39,13 @@
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat;
+import androidx.appcompat.resources.R;
import androidx.collection.ArrayMap;
import androidx.collection.LongSparseArray;
import androidx.collection.LruCache;
import androidx.collection.SparseArrayCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
-import androidx.appcompat.resources.R;
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
@@ -58,9 +58,10 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class ResourceManagerInternal {
- @RestrictTo(LIBRARY_GROUP)
+ /** @hide */
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
interface ResourceManagerHooks {
Drawable createDrawableFor(@NonNull ResourceManagerInternal appCompatDrawableManager,
@NonNull Context context, @DrawableRes final int resId);
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java b/appcompat/resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java
index 0610c89..e62f22b3 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.ContextWrapper;
@@ -36,7 +36,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TintContextWrapper extends ContextWrapper {
private static final Object CACHE_LOCK = new Object();
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/widget/TintInfo.java b/appcompat/resources/src/main/java/androidx/appcompat/widget/TintInfo.java
index ba23f07..23c577b 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/widget/TintInfo.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/widget/TintInfo.java
@@ -16,15 +16,15 @@
package androidx.appcompat.widget;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import androidx.annotation.RestrictTo;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
/** @hide */
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TintInfo {
public ColorStateList mTintList;
public PorterDuff.Mode mTintMode;
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java b/appcompat/resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
index ebc691d..53382f9 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class VectorEnabledTintResources extends Resources {
private static boolean sCompatVectorFromResourcesEnabled = false;
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
index b7bc2c9..0223129 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
@@ -33,6 +33,7 @@
import android.app.Activity;
import android.app.Instrumentation;
import android.content.res.Configuration;
+import android.webkit.WebView;
import androidx.appcompat.test.R;
import androidx.core.content.ContextCompat;
@@ -174,32 +175,31 @@
final FakeTwilightManager twilightManager = new FakeTwilightManager();
TwilightManager.setInstance(twilightManager);
- NightModeActivity activity = mActivityTestRule.getActivity();
-
- // Set MODE_NIGHT_AUTO so that we will change to night mode automatically
- activity = setLocalNightModeAndWaitForRecreate(activity,
+ // Set MODE_NIGHT_AUTO_TIME so that we will change to night mode automatically
+ setLocalNightModeAndWaitForRecreate(mActivityTestRule.getActivity(),
AppCompatDelegate.MODE_NIGHT_AUTO_TIME);
+
// Verify that we're currently in day mode
onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
- final NightModeActivity toTest = activity;
final CountDownLatch resumeCompleteLatch = new CountDownLatch(1);
mActivityTestRule.runOnUiThread(new Runnable() {
@Override
public void run() {
+ final NightModeActivity activity = mActivityTestRule.getActivity();
final Instrumentation instrumentation =
InstrumentationRegistry.getInstrumentation();
// Now fool the Activity into thinking that it has gone into the background
- instrumentation.callActivityOnPause(toTest);
- instrumentation.callActivityOnStop(toTest);
+ instrumentation.callActivityOnPause(activity);
+ instrumentation.callActivityOnStop(activity);
// Now update the twilight manager while the Activity is in the 'background'
twilightManager.setIsNight(true);
// Now tell the Activity that it has gone into the foreground again
- instrumentation.callActivityOnStart(toTest);
- instrumentation.callActivityOnResume(toTest);
+ instrumentation.callActivityOnStart(activity);
+ instrumentation.callActivityOnResume(activity);
resumeCompleteLatch.countDown();
}
@@ -265,6 +265,31 @@
assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, activity);
}
+ @Test
+ public void testLoadingWebViewMaintainsConfiguration() throws Throwable {
+ // Set night mode and wait for the new Activity
+ final NightModeActivity activity = setLocalNightModeAndWaitForRecreate(
+ mActivityTestRule.getActivity(), AppCompatDelegate.MODE_NIGHT_YES);
+
+ // Assert that the context still has a night themed configuration
+ assertConfigurationNightModeEquals(
+ Configuration.UI_MODE_NIGHT_YES,
+ activity.getResources().getConfiguration());
+
+ // Now load a WebView into the Activity
+ mActivityTestRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final WebView webView = new WebView(activity);
+ }
+ });
+
+ // Now assert that the context still has a night themed configuration
+ assertConfigurationNightModeEquals(
+ Configuration.UI_MODE_NIGHT_YES,
+ activity.getResources().getConfiguration());
+ }
+
private static class FakeTwilightManager extends TwilightManager {
private boolean mIsNight;
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java b/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java
index ba2fc74..bcd8c08 100755
--- a/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java
@@ -210,6 +210,45 @@
}
/**
+ * Tests for behavior around setting a tint list without setting a tint mode
+ */
+ @Test
+ @SmallTest
+ public void testImageTintingWithDefaultMode() {
+ final @IdRes int viewId = R.id.view_untinted_source;
+ final Resources res = mActivity.getResources();
+ final T view = (T) mContainer.findViewById(viewId);
+
+ @ColorInt final int sandDefault = ResourcesCompat.getColor(
+ res, R.color.sand_default, null);
+ @ColorInt final int sandDisabled = ResourcesCompat.getColor(
+ res, R.color.sand_disabled, null);
+
+ // This is the fill color of R.drawable.test_drawable_blue set on our view
+ // that we'll be testing in this method
+ @ColorInt final int sourceColor = ResourcesCompat.getColor(
+ res, R.color.test_blue, null);
+
+ final ColorStateList sandColorStateList = ResourcesCompat.getColorStateList(
+ res, R.color.color_state_list_sand, null);
+
+ // Test the default state for tinting set up in the layout XML file.
+ verifyImageSourceIsColoredAs("Default no tinting in enabled state",
+ view, sourceColor, 0);
+
+ // Applying the tint should immediately switch colors
+ onView(withId(viewId)).perform(
+ AppCompatTintableViewActions.setImageSourceTintList(sandColorStateList));
+ verifyImageSourceIsColoredAs("Enabled sand tint after supplying tint list",
+ view, sandDefault, 0);
+
+ // Disabling the view should now switch colors
+ onView(withId(viewId)).perform(setEnabled(false));
+ verifyImageSourceIsColoredAs("Disabled sand tint after disabling view",
+ view, sandDisabled, 0);
+ }
+
+ /**
* This method tests that opaque tinting applied to tintable image source
* is applied correctly after changing the image source itself.
*/
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatSpinnerTest.java b/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatSpinnerTest.java
index e1ddade..d4267b0 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatSpinnerTest.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatSpinnerTest.java
@@ -31,6 +31,7 @@
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
+import android.os.SystemClock;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
@@ -68,12 +69,18 @@
@Override
public void setUp() {
super.setUp();
- mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ if (mActivity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+ mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ SystemClock.sleep(250);
+ }
}
@After
public void cleanUp() {
- mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ if (mActivity.getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+ mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ SystemClock.sleep(250);
+ }
}
/**
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/widget/ListPopupWindowTest.java b/appcompat/src/androidTest/java/androidx/appcompat/widget/ListPopupWindowTest.java
index c38fe17..183e22c 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/widget/ListPopupWindowTest.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/widget/ListPopupWindowTest.java
@@ -27,7 +27,9 @@
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Matchers.any;
@@ -59,6 +61,7 @@
import androidx.test.filters.FlakyTest;
import androidx.test.filters.LargeTest;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
@@ -290,6 +293,47 @@
}
@Test
+ @SmallTest
+ public void testAccessEpicenter() {
+ new Builder().configure();
+ final Rect initialRect = new Rect(10, 10, 20, 20);
+ assertNull(mListPopupWindow.getEpicenterBounds());
+
+ mListPopupWindow.setEpicenterBounds(initialRect);
+ assertEquals(initialRect, mListPopupWindow.getEpicenterBounds());
+
+ mListPopupWindow.setEpicenterBounds(null);
+ assertNull(mListPopupWindow.getEpicenterBounds());
+ }
+
+ @Test
+ @SmallTest
+ public void testEpicenterSetterImmutability() {
+ new Builder().configure();
+ final Rect initialRect = new Rect(10, 10, 20, 20);
+
+ mListPopupWindow.setEpicenterBounds(initialRect);
+ assertEquals(initialRect, mListPopupWindow.getEpicenterBounds());
+
+ initialRect.offset(5, 5);
+ assertNotEquals(initialRect, mListPopupWindow.getEpicenterBounds());
+ }
+
+ @Test
+ @SmallTest
+ public void testEpicenterGetterImmutability() {
+ new Builder().configure();
+ final Rect initialRect = new Rect(10, 10, 20, 20);
+
+ mListPopupWindow.setEpicenterBounds(initialRect);
+ final Rect retrievedRect = mListPopupWindow.getEpicenterBounds();
+ assertEquals(initialRect, retrievedRect);
+
+ retrievedRect.offset(5, 5);
+ assertNotEquals(initialRect, retrievedRect);
+ }
+
+ @Test
@MediumTest
public void testItemClickViaAPI() throws Throwable {
Builder popupBuilder = new Builder().withItemClickListener();
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTest.java b/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTest.java
index d663829..23fb2be 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTest.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTest.java
@@ -17,11 +17,14 @@
package androidx.appcompat.widget;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
import android.app.Activity;
import android.app.Instrumentation;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
+import android.view.Menu;
import android.view.MenuItem;
import androidx.appcompat.content.res.AppCompatResources;
@@ -138,4 +141,13 @@
assertEquals(expectedColor, toolbar.getTitleTextView().getCurrentTextColor());
assertEquals(expectedColor, toolbar.getSubtitleTextView().getCurrentTextColor());
}
+
+ @Test
+ public void testToolbarMenuFromXml() {
+ final Toolbar toolbar = mActivity.findViewById(R.id.toolbar_menu);
+ final Menu menu = toolbar.getMenu();
+
+ assertNotEquals(0, menu.size());
+ assertNotNull(menu.findItem(R.id.action_search));
+ }
}
diff --git a/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml b/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
index 055f918..bbd684e 100644
--- a/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
+++ b/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
@@ -50,4 +50,12 @@
app:titleTextColor="#FF00FF"
app:subtitleTextColor="#FF00FF"/>
+ <androidx.appcompat.widget.Toolbar
+ android:id="@+id/toolbar_menu"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?attr/actionBarSize"
+ app:title="Title"
+ app:menu="@menu/sample_actions" />
+
</LinearLayout>
\ No newline at end of file
diff --git a/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java b/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java
index 8575edb..b24ca17 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java
@@ -16,7 +16,7 @@
package androidx.appcompat.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Configuration;
@@ -92,7 +92,7 @@
public abstract class ActionBar {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
public @interface NavigationMode {}
@@ -137,7 +137,7 @@
public static final int NAVIGATION_MODE_TABS = 2;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(flag=true, value={
DISPLAY_USE_LOGO,
DISPLAY_SHOW_HOME,
@@ -866,7 +866,7 @@
* @return true if the Title field has been truncated
* @hide pending API approval
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isTitleTruncated() { return false; }
/**
@@ -1037,69 +1037,69 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) {
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setShowHideAnimationEnabled(boolean enabled) {
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void onConfigurationChanged(Configuration config) {
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void dispatchMenuVisibilityChanged(boolean visible) {
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ActionMode startActionMode(ActionMode.Callback callback) {
return null;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean openOptionsMenu() {
return false;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean closeOptionsMenu() {
return false;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean invalidateOptionsMenu() {
return false;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean onMenuKeyEvent(KeyEvent event) {
return false;
}
/** @hide **/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean onKeyShortcut(int keyCode, KeyEvent ev) {
return false;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean collapseActionView() {
return false;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setWindowTitle(CharSequence title) {
}
@@ -1109,7 +1109,7 @@
* @return {@code true} if focus changes or {@code false} if focus doesn't change.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
boolean requestFocus() {
return false;
}
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java b/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java
index 37c66d6..c0f2243 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java
@@ -16,7 +16,7 @@
package androidx.appcompat.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Dialog;
import android.content.Context;
@@ -191,7 +191,7 @@
* Internal api to allow hinting for the best button panel layout.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setButtonPanelLayoutHint(int layoutHint) {
mAlert.setButtonPanelLayoutHint(layoutHint);
}
@@ -926,8 +926,9 @@
* This is currently hidden because it seems like people should just
* be able to put padding around the view.
* @hide
+ * @deprecated This method has been deprecated.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Deprecated
public Builder setView(View view, int viewSpacingLeft, int viewSpacingTop,
int viewSpacingRight, int viewSpacingBottom) {
@@ -960,7 +961,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder setRecycleOnMeasureEnabled(boolean enabled) {
P.mRecycleOnMeasure = enabled;
return this;
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
index 03e3f00..c34cc57 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
@@ -16,6 +16,7 @@
package androidx.appcompat.app;
+import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -67,6 +68,12 @@
private Resources mResources;
@Override
+ protected void attachBaseContext(Context newBase) {
+ super.attachBaseContext(newBase);
+ getDelegate().attachBaseContext(newBase);
+ }
+
+ @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
final AppCompatDelegate delegate = getDelegate();
delegate.installViewFactory();
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
index f3e2ec5..6dca0e7 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
@@ -16,7 +16,7 @@
package androidx.appcompat.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.app.Dialog;
@@ -160,7 +160,7 @@
private static int sDefaultNightMode = MODE_NIGHT_UNSPECIFIED;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({MODE_NIGHT_NO, MODE_NIGHT_YES, MODE_NIGHT_AUTO_TIME, MODE_NIGHT_FOLLOW_SYSTEM,
MODE_NIGHT_UNSPECIFIED, MODE_NIGHT_AUTO_BATTERY})
@Retention(RetentionPolicy.SOURCE)
@@ -208,8 +208,10 @@
*
* @param callback An optional callback for AppCompat specific events
*/
- public static AppCompatDelegate create(Activity activity, AppCompatCallback callback) {
- return new AppCompatDelegateImpl(activity, activity.getWindow(), callback);
+ @NonNull
+ public static AppCompatDelegate create(@NonNull Activity activity,
+ @Nullable AppCompatCallback callback) {
+ return new AppCompatDelegateImpl(activity, callback);
}
/**
@@ -217,8 +219,10 @@
*
* @param callback An optional callback for AppCompat specific events
*/
- public static AppCompatDelegate create(Dialog dialog, AppCompatCallback callback) {
- return new AppCompatDelegateImpl(dialog.getContext(), dialog.getWindow(), callback);
+ @NonNull
+ public static AppCompatDelegate create(@NonNull Dialog dialog,
+ @Nullable AppCompatCallback callback) {
+ return new AppCompatDelegateImpl(dialog, callback);
}
/**
@@ -227,8 +231,9 @@
*
* @param callback An optional callback for AppCompat specific events
*/
- public static AppCompatDelegate create(Context context, Window window,
- AppCompatCallback callback) {
+ @NonNull
+ public static AppCompatDelegate create(@NonNull Context context, @NonNull Window window,
+ @Nullable AppCompatCallback callback) {
return new AppCompatDelegateImpl(context, window, callback);
}
@@ -347,6 +352,12 @@
public abstract void addContentView(View v, ViewGroup.LayoutParams lp);
/**
+ * Should be called from {@link Activity#attachBaseContext(Context)}
+ */
+ public void attachBaseContext(Context context) {
+ }
+
+ /**
* Should be called from {@link Activity#onTitleChanged(CharSequence, int)}}
*/
public abstract void setTitle(@Nullable CharSequence title);
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index f1d5a1f..1f7c31f 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -29,6 +29,7 @@
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
+import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
@@ -99,6 +100,8 @@
import androidx.appcompat.widget.VectorEnabledTintResources;
import androidx.appcompat.widget.ViewStubCompat;
import androidx.appcompat.widget.ViewUtils;
+import androidx.collection.ArrayMap;
+import androidx.core.app.ActivityCompat;
import androidx.core.app.NavUtils;
import androidx.core.view.KeyEventDispatcher;
import androidx.core.view.LayoutInflaterCompat;
@@ -113,13 +116,19 @@
import org.xmlpull.v1.XmlPullParser;
import java.util.List;
+import java.util.Map;
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY)
class AppCompatDelegateImpl extends AppCompatDelegate
implements MenuBuilder.Callback, LayoutInflater.Factory2 {
+ private static final Map<Class<?>, Integer> sLocalNightModes = new ArrayMap<>();
+
private static final boolean DEBUG = false;
private static final boolean IS_PRE_LOLLIPOP = Build.VERSION.SDK_INT < 21;
- private static final String KEY_LOCAL_NIGHT_MODE = "appcompat:local_night_mode";
private static final int[] sWindowBackgroundStyleable = {android.R.attr.windowBackground};
@@ -163,10 +172,10 @@
}
}
+ final Object mHost;
final Context mContext;
- final Window mWindow;
- final Window.Callback mOriginalWindowCallback;
- final Window.Callback mAppCompatWindowCallback;
+ Window mWindow;
+ private AppCompatWindowCallback mAppCompatWindowCallback;
final AppCompatCallback mAppCompatCallback;
ActionBar mActionBar;
@@ -214,6 +223,7 @@
private boolean mLongPressBackDown;
+ private boolean mBaseContextAttached;
private boolean mCreated;
@SuppressWarnings("WeakerAccess") /* synthetic access */
boolean mIsDestroyed;
@@ -251,36 +261,76 @@
private AppCompatViewInflater mAppCompatViewInflater;
+ AppCompatDelegateImpl(Activity activity, AppCompatCallback callback) {
+ this(activity, null, callback, activity);
+ }
+
+ AppCompatDelegateImpl(Dialog dialog, AppCompatCallback callback) {
+ this(dialog.getContext(), dialog.getWindow(), callback, dialog);
+ }
+
AppCompatDelegateImpl(Context context, Window window, AppCompatCallback callback) {
+ this(context, window, callback, context);
+ }
+
+ private AppCompatDelegateImpl(Context context, Window window, AppCompatCallback callback,
+ Object host) {
mContext = context;
- mWindow = window;
mAppCompatCallback = callback;
+ mHost = host;
- mOriginalWindowCallback = mWindow.getCallback();
- if (mOriginalWindowCallback instanceof AppCompatWindowCallback) {
- throw new IllegalStateException(
- "AppCompat has already installed itself into the Window");
+ if (window != null) {
+ attachToWindow(window);
}
- mAppCompatWindowCallback = new AppCompatWindowCallback(mOriginalWindowCallback);
- // Now install the new callback
- mWindow.setCallback(mAppCompatWindowCallback);
- final TintTypedArray a = TintTypedArray.obtainStyledAttributes(
- context, null, sWindowBackgroundStyleable);
- final Drawable winBg = a.getDrawableIfKnown(0);
- if (winBg != null) {
- mWindow.setBackgroundDrawable(winBg);
+ if (mLocalNightMode == MODE_NIGHT_UNSPECIFIED && mHost instanceof Dialog) {
+ final AppCompatActivity activity = tryUnwrapContext();
+ if (activity != null) {
+ // This code path is used to detect when this Delegate is a child Delegate from
+ // an Activity, primarily for Dialogs. Dialogs use the Activity as it's Context,
+ // so we want to make sure that the this 'child' delegate does not interfere
+ // with the Activity config. The simplest way to do that is to match the
+ // outer Activity's local night mode
+ mLocalNightMode = activity.getDelegate().getLocalNightMode();
+ }
}
- a.recycle();
+ if (mLocalNightMode == MODE_NIGHT_UNSPECIFIED) {
+ // Try and read the current night mode from our static store
+ final Integer value = sLocalNightModes.get(mHost.getClass());
+ if (value != null) {
+ mLocalNightMode = value;
+ // Finally remove the value
+ sLocalNightModes.remove(mHost.getClass());
+ }
+ }
+ }
+
+ @Override
+ public void attachBaseContext(Context context) {
+ applyDayNight();
+ mBaseContextAttached = true;
}
@Override
public void onCreate(Bundle savedInstanceState) {
- if (mOriginalWindowCallback instanceof Activity) {
+ // attachBaseContext will only be called from an Activity, so make sure we switch this for
+ // Dialogs, etc
+ mBaseContextAttached = true;
+
+ // We lazily fetch the Window for Activities, to allow DayNight to apply in
+ // attachBaseContext
+ if (mWindow == null && mHost instanceof Activity) {
+ attachToWindow(((Activity) mHost).getWindow());
+ }
+
+ if (mWindow == null) {
+ throw new IllegalStateException("We have not been given a Window");
+ }
+
+ if (mHost instanceof Activity) {
String parentActivityName = null;
try {
- parentActivityName = NavUtils.getParentActivityName(
- (Activity) mOriginalWindowCallback);
+ parentActivityName = NavUtils.getParentActivityName((Activity) mHost);
} catch (IllegalArgumentException iae) {
// Ignore in this case
}
@@ -295,26 +345,16 @@
}
}
- if (mLocalNightMode == MODE_NIGHT_UNSPECIFIED && mContext instanceof AppCompatActivity) {
- final AppCompatDelegate delegate = ((AppCompatActivity) mContext).getDelegate();
- if (delegate != this) {
- // This code path is used to detect when this Delegate is a child Delegate from
- // an Activity, primarily for Dialogs. Dialogs use the Activity as it's Context,
- // so we want to make sure that the this 'child' delegate does not interfere
- // with the Activity config. The simplest way to do that is to match the
- // outer Activity's local night mode
- mLocalNightMode = delegate.getLocalNightMode();
- }
- }
- if (savedInstanceState != null && mLocalNightMode == MODE_NIGHT_UNSPECIFIED) {
- // If we have a icicle and we haven't had a local night mode set yet, try and read
- // it from the icicle
- mLocalNightMode = savedInstanceState.getInt(KEY_LOCAL_NIGHT_MODE,
- MODE_NIGHT_UNSPECIFIED);
- }
-
applyDayNight();
+ final TintTypedArray a = TintTypedArray.obtainStyledAttributes(
+ mContext, null, sWindowBackgroundStyleable);
+ final Drawable winBg = a.getDrawableIfKnown(0);
+ if (winBg != null) {
+ mWindow.setBackgroundDrawable(winBg);
+ }
+ a.recycle();
+
mCreated = true;
}
@@ -347,11 +387,10 @@
return;
}
- if (mOriginalWindowCallback instanceof Activity) {
- mActionBar = new WindowDecorActionBar((Activity) mOriginalWindowCallback,
- mOverlayActionBar);
- } else if (mOriginalWindowCallback instanceof Dialog) {
- mActionBar = new WindowDecorActionBar((Dialog) mOriginalWindowCallback);
+ if (mHost instanceof Activity) {
+ mActionBar = new WindowDecorActionBar((Activity) mHost, mOverlayActionBar);
+ } else if (mHost instanceof Dialog) {
+ mActionBar = new WindowDecorActionBar((Dialog) mHost);
}
if (mActionBar != null) {
mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
@@ -360,7 +399,7 @@
@Override
public void setSupportActionBar(Toolbar toolbar) {
- if (!(mOriginalWindowCallback instanceof Activity)) {
+ if (!(mHost instanceof Activity)) {
// Only Activities support custom Action Bars
return;
}
@@ -382,8 +421,8 @@
}
if (toolbar != null) {
- final ToolbarActionBar tbab = new ToolbarActionBar(toolbar,
- ((Activity) mOriginalWindowCallback).getTitle(), mAppCompatWindowCallback);
+ final ToolbarActionBar tbab = new ToolbarActionBar(toolbar, getTitle(),
+ mAppCompatWindowCallback);
mActionBar = tbab;
mWindow.setCallback(tbab.getWrappedWindowCallback());
} else {
@@ -484,43 +523,43 @@
@Override
public void setContentView(View v) {
ensureSubDecor();
- ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+ ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
contentParent.removeAllViews();
contentParent.addView(v);
- mOriginalWindowCallback.onContentChanged();
+ mAppCompatWindowCallback.getWrapped().onContentChanged();
}
@Override
public void setContentView(int resId) {
ensureSubDecor();
- ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+ ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
contentParent.removeAllViews();
LayoutInflater.from(mContext).inflate(resId, contentParent);
- mOriginalWindowCallback.onContentChanged();
+ mAppCompatWindowCallback.getWrapped().onContentChanged();
}
@Override
public void setContentView(View v, ViewGroup.LayoutParams lp) {
ensureSubDecor();
- ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+ ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
contentParent.removeAllViews();
contentParent.addView(v, lp);
- mOriginalWindowCallback.onContentChanged();
+ mAppCompatWindowCallback.getWrapped().onContentChanged();
}
@Override
public void addContentView(View v, ViewGroup.LayoutParams lp) {
ensureSubDecor();
- ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+ ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
contentParent.addView(v, lp);
- mOriginalWindowCallback.onContentChanged();
+ mAppCompatWindowCallback.getWrapped().onContentChanged();
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (mLocalNightMode != MODE_NIGHT_UNSPECIFIED) {
// If we have a local night mode set, save it
- outState.putInt(KEY_LOCAL_NIGHT_MODE, mLocalNightMode);
+ sLocalNightModes.put(mHost.getClass(), mLocalNightMode);
}
}
@@ -550,6 +589,24 @@
mThemeResId = themeResId;
}
+ private void attachToWindow(@NonNull Window window) {
+ if (mWindow != null) {
+ throw new IllegalStateException(
+ "AppCompat has already installed itself into the Window");
+ }
+
+ final Window.Callback callback = window.getCallback();
+ if (callback instanceof AppCompatWindowCallback) {
+ throw new IllegalStateException(
+ "AppCompat has already installed itself into the Window");
+ }
+ mAppCompatWindowCallback = new AppCompatWindowCallback(callback);
+ // Now install the new callback
+ window.setCallback(mAppCompatWindowCallback);
+
+ mWindow = window;
+ }
+
private void ensureSubDecor() {
if (!mSubDecorInstalled) {
mSubDecor = createSubDecor();
@@ -884,8 +941,8 @@
final CharSequence getTitle() {
// If the original window callback is an Activity, we'll use its title
- if (mOriginalWindowCallback instanceof Activity) {
- return ((Activity) mOriginalWindowCallback).getTitle();
+ if (mHost instanceof Activity) {
+ return ((Activity) mHost).getTitle();
}
// Else, we'll return the title we have recorded ourselves
return mTitle;
@@ -1199,8 +1256,7 @@
boolean dispatchKeyEvent(KeyEvent event) {
// Check AppCompatDialog directly since it isn't able to implement KeyEventDispatcher
// while it is @hide.
- if (mOriginalWindowCallback instanceof KeyEventDispatcher.Component
- || mOriginalWindowCallback instanceof AppCompatDialog) {
+ if (mHost instanceof KeyEventDispatcher.Component || mHost instanceof AppCompatDialog) {
View root = mWindow.getDecorView();
if (root != null && KeyEventDispatcher.dispatchBeforeHierarchy(root, event)) {
return true;
@@ -1209,7 +1265,7 @@
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
// If this is a MENU event, let the Activity have a go.
- if (mOriginalWindowCallback.dispatchKeyEvent(event)) {
+ if (mAppCompatWindowCallback.getWrapped().dispatchKeyEvent(event)) {
return true;
}
}
@@ -1361,6 +1417,22 @@
return onCreateView(null, name, context, attrs);
}
+ @Nullable
+ private AppCompatActivity tryUnwrapContext() {
+ Context context = mContext;
+ while (context != null) {
+ if (context instanceof AppCompatActivity) {
+ return (AppCompatActivity) context;
+ }
+ if (context instanceof ContextWrapper) {
+ context = ((ContextWrapper) context).getBaseContext();
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
private void openPanel(final PanelFeatureState st, KeyEvent event) {
// Already open, return
if (st.isOpen || mIsDestroyed) {
@@ -1814,7 +1886,7 @@
// We need to be careful which callback we dispatch the call to. We can not dispatch
// this to the Window's callback since that will call back into this method and cause a
// crash. Instead we need to dispatch down to the original Activity/Dialog/etc.
- mOriginalWindowCallback.onPanelClosed(featureId, menu);
+ mAppCompatWindowCallback.getWrapped().onPanelClosed(featureId, menu);
}
}
@@ -2111,11 +2183,9 @@
*/
private boolean updateForNightMode(@ApplyableNightMode final int mode,
final boolean allowRecreation) {
- final Resources res = mContext.getResources();
- final Configuration config = res.getConfiguration();
- final int currentNightMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ boolean handled = false;
- int newNightMode = currentNightMode;
+ int newNightMode;
switch (mode) {
case MODE_NIGHT_YES:
newNightMode = Configuration.UI_MODE_NIGHT_YES;
@@ -2123,6 +2193,7 @@
case MODE_NIGHT_NO:
newNightMode = Configuration.UI_MODE_NIGHT_NO;
break;
+ default:
case MODE_NIGHT_FOLLOW_SYSTEM:
// If we're following the system, we just use the system default from the
// application context
@@ -2133,67 +2204,97 @@
break;
}
- boolean handled = false;
+ final boolean activityHandlingUiMode = isActivityManifestHandlingUiMode();
- if (currentNightMode != newNightMode) {
- final boolean manifestHandlingUiMode = isActivityManifestHandlingUiMode();
- final boolean shouldRecreateOnNightModeChange = allowRecreation
- && !manifestHandlingUiMode && mCreated && mContext instanceof Activity;
+ if (!activityHandlingUiMode && Build.VERSION.SDK_INT >= 17 && !mBaseContextAttached
+ && mHost instanceof android.view.ContextThemeWrapper) {
+ // If we're here then we can try and apply an override configuration on the Context.
+ final Configuration conf = new Configuration();
+ conf.uiMode = newNightMode | (conf.uiMode & ~Configuration.UI_MODE_NIGHT_MASK);
- if (shouldRecreateOnNightModeChange) {
+ try {
if (DEBUG) {
- Log.d(TAG, "updateForNightMode. Night mode changed, recreating Activity."
- + " Mode: " + mode);
+ Log.d(TAG, "updateForNightMode. Applying override config");
}
- // If we've already been created, we need to recreate the Activity for the
- // mode to be applied
- ((Activity) mContext).recreate();
- } else if (!manifestHandlingUiMode) {
- // If the Activity is not set to handle uiMode config changes we will
- // update the Resources with a new Configuration with an updated UI Mode
- final Configuration newConf = new Configuration(config);
- newConf.uiMode = newNightMode | (config.uiMode & ~Configuration.UI_MODE_NIGHT_MASK);
- res.updateConfiguration(newConf, res.getDisplayMetrics());
-
- if (DEBUG) {
- Log.d(TAG, "updateForNightMode. Night mode changed, updated res config."
- + " Mode: " + mode);
- }
- // We may need to flush the Resources' drawable cache due to framework bugs.
- if (Build.VERSION.SDK_INT < 26) {
- ResourcesFlusher.flush(res);
- }
-
- if (mThemeResId != 0) {
- // We need to re-apply the theme so that it reflected the new
- // configuration
- mContext.setTheme(mThemeResId);
-
- if (Build.VERSION.SDK_INT >= 23) {
- // On M+ setTheme only applies if the themeResId actually changes,
- // since we have no way to publicly check what the Theme's current
- // themeResId is, we just manually apply it anyway. Most of the time
- // this is what we need anyway (since the themeResId does not
- // often change)
- mContext.getTheme().applyStyle(mThemeResId, true);
- }
- }
+ ((android.view.ContextThemeWrapper) mHost).applyOverrideConfiguration(conf);
+ handled = true;
+ } catch (IllegalStateException e) {
+ // applyOverrideConfiguration throws an IllegalStateException if it's resources
+ // have already been created. Since there's no way to check this beforehand we
+ // just have to try it and catch the exception
+ handled = false;
}
- handled = true;
- } else {
- if (DEBUG) {
- Log.d(TAG, "applyNightMode() | Skipping. Night mode has not changed: " + mode);
+ }
+
+ if (!handled && !activityHandlingUiMode) {
+ final int currentNightMode = mContext.getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_NIGHT_MASK;
+ if (currentNightMode != newNightMode) {
+ if (allowRecreation && (Build.VERSION.SDK_INT >= 17 || mCreated)
+ && mHost instanceof Activity) {
+ // If we're created and are an Activity, we can recreate to apply
+ // The SDK_INT check above is because applyOverrideConfiguration only exists on
+ // API 17+, so we don't want to get into an loop of infinite recreations.
+ // On < API 17 we need to use updateConfiguration before we're 'created'
+ if (DEBUG) {
+ Log.d(TAG, "updateForNightMode. Recreating Activity");
+ }
+ ActivityCompat.recreate((Activity) mHost);
+ handled = true;
+ }
+ if (!handled) {
+ // Else we need to use the updateConfiguration path
+ if (DEBUG) {
+ Log.d(TAG, "updateForNightMode. Updating resources config");
+ }
+ updateResourcesConfigurationForNightMode(newNightMode);
+ handled = true;
+ }
+ } else {
+ if (DEBUG) {
+ Log.d(TAG, "updateForNightMode. Skipping. Night mode: " + mode);
+ }
}
}
// Notify the activity of the night mode
- if (mContext instanceof AppCompatActivity) {
- ((AppCompatActivity) mContext).onNightModeChanged(mode);
+ if (handled && mHost instanceof AppCompatActivity) {
+ ((AppCompatActivity) mHost).onNightModeChanged(mode);
}
return handled;
}
+ private void updateResourcesConfigurationForNightMode(final int uiModeNightModeValue) {
+ // If the Activity is not set to handle uiMode config changes we will
+ // update the Resources with a new Configuration with an updated UI Mode
+ final Resources res = mContext.getResources();
+ final Configuration conf = new Configuration();
+ conf.uiMode = uiModeNightModeValue
+ | (res.getConfiguration().uiMode & ~Configuration.UI_MODE_NIGHT_MASK);
+ res.updateConfiguration(conf, null);
+
+ // We may need to flush the Resources' drawable cache due to framework bugs.
+ if (Build.VERSION.SDK_INT < 26) {
+ ResourcesFlusher.flush(res);
+ }
+
+ if (mThemeResId != 0) {
+ // We need to re-apply the theme so that it reflected the new
+ // configuration
+ mContext.setTheme(mThemeResId);
+
+ if (Build.VERSION.SDK_INT >= 23) {
+ // On M+ setTheme only applies if the themeResId actually changes,
+ // since we have no way to publicly check what the Theme's current
+ // themeResId is, we just manually apply it anyway. Most of the time
+ // this is what we need anyway (since the themeResId does not
+ // often change)
+ mContext.getTheme().applyStyle(mThemeResId, true);
+ }
+ }
+ }
+
/**
* @hide
*/
@@ -2215,11 +2316,11 @@
}
private boolean isActivityManifestHandlingUiMode() {
- if (!mActivityHandlesUiModeChecked && mContext instanceof Activity) {
+ if (!mActivityHandlesUiModeChecked && mHost instanceof Activity) {
final PackageManager pm = mContext.getPackageManager();
try {
final ActivityInfo info = pm.getActivityInfo(
- new ComponentName(mContext, mContext.getClass()), 0);
+ new ComponentName(mContext, mHost.getClass()), 0);
mActivityHandlesUiMode = (info.configChanges & ActivityInfo.CONFIG_UI_MODE) != 0;
} catch (PackageManager.NameNotFoundException e) {
// This shouldn't happen but let's not crash because of it, we'll just log and
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
index e1539cb..d0443af 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
@@ -16,7 +16,7 @@
package androidx.appcompat.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Dialog;
import android.content.Context;
@@ -56,11 +56,15 @@
public AppCompatDialog(Context context, int theme) {
super(context, getThemeResId(context, theme));
+ final AppCompatDelegate delegate = getDelegate();
+ // Make sure we provide the delegate with the current theme res id
+ delegate.onSetTheme(getThemeResId(context, theme));
+
// This is a bit weird, but Dialog's are typically created and setup before being shown,
// which means that we can't rely on onCreate() being called before a content view is set.
// To workaround this, we call onCreate(null) in the ctor, and then again as usual in
// onCreate().
- getDelegate().onCreate(null);
+ delegate.onCreate(null);
}
protected AppCompatDialog(Context context, boolean cancelable,
@@ -153,7 +157,7 @@
* @hide
*/
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void invalidateOptionsMenu() {
getDelegate().invalidateOptionsMenu();
}
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java
index 2b2508a..feb05f0 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java
@@ -17,7 +17,7 @@
package androidx.appcompat.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Dialog;
import android.os.Bundle;
@@ -44,7 +44,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setupDialog(@NonNull Dialog dialog, int style) {
if (dialog instanceof AppCompatDialog) {
diff --git a/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java b/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
index 88ba36d..7471b76 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
@@ -16,7 +16,7 @@
package androidx.appcompat.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.app.Dialog;
@@ -76,7 +76,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class WindowDecorActionBar extends ActionBar implements
ActionBarOverlayLayout.ActionBarVisibilityCallback {
private static final String TAG = "WindowDecorActionBar";
@@ -185,7 +185,7 @@
* Only for edit mode.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public WindowDecorActionBar(View layout) {
assert layout.isInEditMode();
init(layout);
@@ -982,7 +982,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback {
private final Context mActionModeContext;
private final MenuBuilder mMenu;
@@ -1158,7 +1158,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public class TabImpl extends ActionBar.Tab {
private ActionBar.TabListener mCallback;
private Object mTag;
diff --git a/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java b/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
index 41933d08..0ff2a5a 100644
--- a/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
+++ b/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
@@ -16,7 +16,7 @@
package androidx.appcompat.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -88,7 +88,7 @@
public static final int ARROW_DIRECTION_END = 3;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({ARROW_DIRECTION_LEFT, ARROW_DIRECTION_RIGHT,
ARROW_DIRECTION_START, ARROW_DIRECTION_END})
@Retention(RetentionPolicy.SOURCE)
diff --git a/appcompat/src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java b/appcompat/src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java
index 7a1028d..145a798 100644
--- a/appcompat/src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java
+++ b/appcompat/src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java
@@ -16,7 +16,7 @@
package androidx.appcompat.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Rect;
@@ -30,7 +30,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AllCapsTransformationMethod implements TransformationMethod {
private Locale mLocale;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/ActionBarPolicy.java b/appcompat/src/main/java/androidx/appcompat/view/ActionBarPolicy.java
index bde69a2..d00f006 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/ActionBarPolicy.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/ActionBarPolicy.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Configuration;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionBarPolicy {
private Context mContext;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/ActionMode.java b/appcompat/src/main/java/androidx/appcompat/view/ActionMode.java
index df3e73d..4553b87 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/ActionMode.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/ActionMode.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.Menu;
import android.view.MenuInflater;
@@ -220,7 +220,7 @@
* @return true if the UI used to show this action mode can take focus
* @hide Internal use only
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isUiFocusable() {
return true;
}
diff --git a/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java b/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
index aa091dc..3d3bcd9 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
@@ -15,7 +15,7 @@
*/
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.view.Menu;
@@ -35,7 +35,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class StandaloneActionMode extends ActionMode implements MenuBuilder.Callback {
private Context mContext;
private ActionBarContextView mContextView;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java b/appcompat/src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java
index afa772b..7f8be43 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.view.ActionMode;
@@ -39,7 +39,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class SupportActionModeWrapper extends ActionMode {
final Context mContext;
@@ -139,7 +139,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class CallbackWrapper implements androidx.appcompat.view.ActionMode.Callback {
final Callback mWrappedCallback;
final Context mContext;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/SupportMenuInflater.java b/appcompat/src/main/java/androidx/appcompat/view/SupportMenuInflater.java
index cbcfdc6..1bd8cbd 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/SupportMenuInflater.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/SupportMenuInflater.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.content.Context;
@@ -65,7 +65,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class SupportMenuInflater extends MenuInflater {
static final String LOG_TAG = "SupportMenuInflater";
diff --git a/appcompat/src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java b/appcompat/src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java
index 82c270e..01b8e30 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.View;
import android.view.animation.Interpolator;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ViewPropertyAnimatorCompatSet {
final ArrayList<ViewPropertyAnimatorCompat> mAnimators;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java b/appcompat/src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java
index b5bb8d56..996ee99 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.ActionMode;
import android.view.KeyEvent;
@@ -42,7 +42,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class WindowCallbackWrapper implements Window.Callback {
final Window.Callback mWrapped;
@@ -183,4 +183,8 @@
public void onPointerCaptureChanged(boolean hasCapture) {
mWrapped.onPointerCaptureChanged(hasCapture);
}
+
+ public final Window.Callback getWrapped() {
+ return mWrapped;
+ }
}
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java b/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java
index 562dfca..b07d90f 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.Intent;
@@ -39,7 +39,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionMenuItem implements SupportMenuItem {
private final int mId;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java b/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java
index 001d8b4..89d3d4b 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Configuration;
@@ -39,7 +39,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionMenuItemView extends AppCompatTextView
implements MenuView.ItemView, View.OnClickListener, ActionMenuView.ActionMenuChildView {
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java b/appcompat/src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java
index 3399ef4..769f66a 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.view.LayoutInflater;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class BaseMenuPresenter implements MenuPresenter {
protected Context mSystemContext;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java b/appcompat/src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java
index ab75f59..7733139 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -35,7 +35,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class ExpandedMenuView extends ListView
implements ItemInvoker, MenuView, OnItemClickListener {
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java b/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java
index 89cb92c..1e90a80 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -44,7 +44,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ListMenuItemView extends LinearLayout
implements MenuView.ItemView, AbsListView.SelectionBoundsAdjuster {
private static final String TAG = "ListMenuItemView";
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java b/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java
index 1677e96..5dc51fa 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.os.Bundle;
@@ -40,7 +40,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ListMenuPresenter implements MenuPresenter, AdapterView.OnItemClickListener {
private static final String TAG = "ListMenuPresenter";
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuAdapter.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuAdapter.java
index 15beea8..7add7e9 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuAdapter.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuAdapter.java
@@ -15,7 +15,7 @@
*/
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.LayoutInflater;
import android.view.View;
@@ -29,7 +29,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MenuAdapter extends BaseAdapter {
MenuBuilder mAdapterMenu;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
index 2b5e653..38eb882 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.content.Context;
@@ -56,7 +56,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MenuBuilder implements SupportMenu {
private static final String TAG = "MenuBuilder";
@@ -197,7 +197,7 @@
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface Callback {
/**
@@ -221,7 +221,7 @@
* Called by menu items to execute their associated action
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface ItemInvoker {
boolean invokeItem(MenuItemImpl item);
}
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java
index d18f8fd..5d3ffb6 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -48,7 +48,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class MenuItemImpl implements SupportMenuItem {
private static final String TAG = "MenuItemImpl";
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java
index 016ef06..46f191f 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.Intent;
@@ -43,7 +43,7 @@
* Wraps a support {@link SupportMenuItem} as a framework {@link android.view.MenuItem}
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MenuItemWrapperICS extends BaseMenuWrapper implements MenuItem {
static final String LOG_TAG = "MenuItemWrapper";
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
index 5cac689..9bc4584 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Point;
@@ -43,7 +43,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MenuPopupHelper implements MenuHelper {
private static final int TOUCH_EPICENTER_SIZE_DP = 48;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
index 75e2447..8ba99363 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.os.Parcelable;
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface MenuPresenter {
/**
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuView.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuView.java
index a9e94e6..0ed86da 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuView.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.drawable.Drawable;
@@ -28,7 +28,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface MenuView {
/**
* Initializes the menu to the given menu. This should be called after the
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java
index 6d5b90a..1f47ef1 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.content.Context;
@@ -33,7 +33,7 @@
* Wraps a support {@link SupportMenu} as a framework {@link android.view.Menu}
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MenuWrapperICS extends BaseMenuWrapper implements Menu {
private final SupportMenu mWrappedObject;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/ShowableListMenu.java b/appcompat/src/main/java/androidx/appcompat/view/menu/ShowableListMenu.java
index 76b9721..a365a53 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/ShowableListMenu.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/ShowableListMenu.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.widget.ListView;
@@ -27,7 +27,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface ShowableListMenu {
void show();
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java b/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
index 8f5f153..a456183 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class SubMenuBuilder extends MenuBuilder implements SubMenu {
private MenuBuilder mParentMenu;
private MenuItemImpl mItem;
diff --git a/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuWrapperICS.java b/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuWrapperICS.java
index 241d11c..04312fc 100644
--- a/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuWrapperICS.java
+++ b/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuWrapperICS.java
@@ -16,7 +16,7 @@
package androidx.appcompat.view.menu;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -31,7 +31,7 @@
* Wraps a support {@link SupportSubMenu} as a framework {@link android.view.SubMenu}
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class SubMenuWrapperICS extends MenuWrapperICS implements SubMenu {
private final SupportSubMenu mSubMenu;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java b/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
index 49e063f..4775d45 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -36,7 +36,7 @@
* It applies special styles as needed to help handle animated transitions between them.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionBarContainer extends FrameLayout {
private boolean mIsTransitioning;
private View mTabContainer;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java b/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
index c577552c..9bc598c 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.text.TextUtils;
@@ -37,7 +37,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionBarContextView extends AbsActionBarView {
private static final String TAG = "ActionBarContextView";
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java b/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java
index a5d4053..b381680 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -53,7 +53,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent,
NestedScrollingParent, NestedScrollingParent2, NestedScrollingParent3 {
private static final String TAG = "ActionBarOverlayLayout";
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java b/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
index c145677..4b82d87 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
@@ -15,7 +15,7 @@
*/
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Configuration;
@@ -117,7 +117,7 @@
* @param presenter Menu presenter used to display popup menu
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setPresenter(ActionMenuPresenter presenter) {
mPresenter = presenter;
mPresenter.setMenuView(this);
@@ -567,13 +567,13 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isOverflowReserved() {
return mReserveOverflow;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setOverflowReserved(boolean reserveOverflow) {
mReserveOverflow = reserveOverflow;
}
@@ -611,7 +611,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public LayoutParams generateOverflowButtonLayoutParams() {
LayoutParams result = generateDefaultLayoutParams();
result.isOverflowButton = true;
@@ -620,21 +620,21 @@
/** @hide */
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean invokeItem(MenuItemImpl item) {
return mMenu.performItemAction(item, 0);
}
/** @hide */
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getWindowAnimations() {
return 0;
}
/** @hide */
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void initialize(MenuBuilder menu) {
mMenu = menu;
}
@@ -667,7 +667,7 @@
* Must be called before the first call to getMenu()
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {
mActionMenuPresenterCallback = pcb;
mMenuBuilderCallback = mcb;
@@ -677,7 +677,7 @@
* Returns the current menu or null if one has not yet been configured.
* @hide Internal use only for action bar integration
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MenuBuilder peekMenu() {
return mMenu;
}
@@ -711,7 +711,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isOverflowMenuShowPending() {
return mPresenter != null && mPresenter.isOverflowMenuShowPending();
}
@@ -728,7 +728,7 @@
/**
* @hide Private LinearLayout (superclass) API. Un-hide if LinearLayout API is made public.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected boolean hasSupportDividerBeforeChildAt(int childIndex) {
if (childIndex == 0) {
return false;
@@ -751,7 +751,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setExpandedActionViewsExclusive(boolean exclusive) {
mPresenter.setExpandedActionViewsExclusive(exclusive);
}
@@ -804,7 +804,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface ActionMenuChildView {
boolean needsDividerBefore();
boolean needsDividerAfter();
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java b/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java
index 86c35a4..a350c0d 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.Intent;
@@ -72,7 +72,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ActivityChooserView extends ViewGroup implements
ActivityChooserModel.ActivityChooserModelClient {
@@ -337,7 +337,7 @@
* Set the provider hosting this view, if applicable.
* @hide Internal use only
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setProvider(ActionProvider provider) {
mProvider = provider;
}
@@ -858,7 +858,7 @@
* Allows us to set the background using TintTypedArray
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class InnerLayout extends LinearLayout {
private static final int[] TINT_ATTRS = {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java b/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
index bae1f49..9ab8d9e 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -48,7 +48,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AlertDialogLayout extends LinearLayoutCompat {
public AlertDialogLayout(@Nullable Context context) {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
index febd7cb..030c41e 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -115,7 +115,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -129,7 +129,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -143,7 +143,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -157,7 +157,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
index 98425bf..8027efd 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -100,7 +100,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -114,7 +114,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -128,7 +128,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -142,7 +142,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
@@ -211,7 +211,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setAutoSizeTextTypeWithDefaults(
@TextViewCompat.AutoSizeTextType int autoSizeTextType) {
@@ -227,7 +227,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setAutoSizeTextTypeUniformWithConfiguration(
int autoSizeMinTextSize,
@@ -248,7 +248,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
throws IllegalArgumentException {
@@ -264,7 +264,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@TextViewCompat.AutoSizeTextType
public int getAutoSizeTextType() {
@@ -283,7 +283,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int getAutoSizeStepGranularity() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -299,7 +299,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int getAutoSizeMinTextSize() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -315,7 +315,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int getAutoSizeMaxTextSize() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -331,7 +331,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int[] getAutoSizeTextAvailableSizes() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
index 6d65eca..d5d4019 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -102,7 +102,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportButtonTintList(@Nullable ColorStateList tint) {
if (mCompoundButtonHelper != null) {
@@ -114,7 +114,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
@Override
public ColorStateList getSupportButtonTintList() {
@@ -127,7 +127,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mCompoundButtonHelper != null) {
@@ -139,7 +139,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
@Override
public PorterDuff.Mode getSupportButtonTintMode() {
@@ -153,7 +153,7 @@
* {@link ViewCompat#setBackgroundTintList(View, ColorStateList)}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -167,7 +167,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -181,7 +181,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -195,7 +195,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java
index e103dda..6d582e8 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.appcompat.content.res.AppCompatResources.getColorStateList;
import static androidx.appcompat.widget.ThemeUtils.getDisabledThemeAttrColor;
import static androidx.appcompat.widget.ThemeUtils.getThemeAttrColor;
@@ -42,7 +42,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class AppCompatDrawableManager {
private static final String TAG = "AppCompatDrawableManag";
private static final boolean DEBUG = false;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
index 51282ae..6de13fe 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -118,7 +118,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -132,7 +132,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -146,7 +146,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -160,7 +160,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
index 7ebc7e6..8f41021 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -131,7 +131,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -145,7 +145,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -159,7 +159,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -173,7 +173,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
@@ -186,7 +186,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportImageTintList(@Nullable ColorStateList tint) {
if (mImageHelper != null) {
@@ -200,7 +200,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportImageTintList() {
@@ -214,7 +214,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportImageTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mImageHelper != null) {
@@ -228,7 +228,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportImageTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java
index 282ffcd..faf62f7 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
@@ -34,7 +34,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AppCompatImageHelper {
private final ImageView mView;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
index f6dc092..92b0c67 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -30,7 +30,6 @@
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.appcompat.R;
import androidx.core.view.TintableBackgroundView;
import androidx.core.widget.ImageViewCompat;
import androidx.core.widget.TintableImageSourceView;
@@ -141,7 +140,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -155,7 +154,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -169,7 +168,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -183,7 +182,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
@@ -197,7 +196,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportImageTintList(@Nullable ColorStateList tint) {
if (mImageHelper != null) {
@@ -211,7 +210,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportImageTintList() {
@@ -225,7 +224,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportImageTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mImageHelper != null) {
@@ -239,7 +238,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportImageTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
index 1498adb..c92eb4a 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -112,7 +112,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -126,7 +126,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -140,7 +140,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -154,7 +154,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
index e9c654d..399bf5b 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -102,7 +102,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportButtonTintList(@Nullable ColorStateList tint) {
if (mCompoundButtonHelper != null) {
@@ -114,7 +114,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
@Override
public ColorStateList getSupportButtonTintList() {
@@ -127,7 +127,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mCompoundButtonHelper != null) {
@@ -139,7 +139,7 @@
* This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
@Override
public PorterDuff.Mode getSupportButtonTintMode() {
@@ -154,7 +154,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -168,7 +168,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -182,7 +182,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -196,7 +196,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
index 9c4819c..86886bd 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -486,7 +486,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -500,7 +500,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -515,7 +515,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -529,7 +529,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
index 9208e04..fb97e5e 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.widget.AutoSizeableTextView.PLATFORM_SUPPORTS_AUTOSIZE;
import android.annotation.SuppressLint;
@@ -522,7 +522,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void onLayout(boolean changed, int left, int top, int right, int bottom) {
if (!PLATFORM_SUPPORTS_AUTOSIZE) {
autoSizeText();
@@ -530,7 +530,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setTextSize(int unit, float size) {
if (!PLATFORM_SUPPORTS_AUTOSIZE) {
if (!isAutoSizeEnabled()) {
@@ -540,13 +540,13 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void autoSizeText() {
mAutoSizeTextHelper.autoSizeText();
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
boolean isAutoSizeEnabled() {
return mAutoSizeTextHelper.isAutoSizeEnabled();
}
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
index f83c7b6..c0d7238 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -129,7 +129,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
if (mBackgroundTintHelper != null) {
@@ -143,7 +143,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public ColorStateList getSupportBackgroundTintList() {
@@ -157,7 +157,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
if (mBackgroundTintHelper != null) {
@@ -171,7 +171,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@Nullable
public PorterDuff.Mode getSupportBackgroundTintMode() {
@@ -232,7 +232,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setAutoSizeTextTypeWithDefaults(
@TextViewCompat.AutoSizeTextType int autoSizeTextType) {
@@ -252,7 +252,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setAutoSizeTextTypeUniformWithConfiguration(
int autoSizeMinTextSize,
@@ -277,7 +277,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
throws IllegalArgumentException {
@@ -296,7 +296,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
@TextViewCompat.AutoSizeTextType
public int getAutoSizeTextType() {
@@ -318,7 +318,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int getAutoSizeStepGranularity() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -337,7 +337,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int getAutoSizeMinTextSize() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -356,7 +356,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int getAutoSizeMaxTextSize() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -375,7 +375,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int[] getAutoSizeTextAvailableSizes() {
if (PLATFORM_SUPPORTS_AUTOSIZE) {
@@ -626,7 +626,7 @@
*/
@Nullable
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ColorStateList getSupportCompoundDrawablesTintList() {
return mTextHelper.getCompoundDrawableTintList();
}
@@ -649,7 +649,7 @@
* @hide
*/
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSupportCompoundDrawablesTintList(@Nullable ColorStateList tintList) {
mTextHelper.setCompoundDrawableTintList(tintList);
mTextHelper.applyCompoundDrawablesTints();
@@ -669,7 +669,7 @@
*/
@Nullable
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
return mTextHelper.getCompoundDrawableTintMode();
}
@@ -689,7 +689,7 @@
* @hide
*/
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
mTextHelper.setCompoundDrawableTintMode(tintMode);
mTextHelper.applyCompoundDrawablesTints();
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java
index 923ea5b..b52de5c 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -199,7 +199,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setAutoSizeTextTypeWithDefaults(@TextViewCompat.AutoSizeTextType int autoSizeTextType) {
if (supportsAutoSizeText()) {
switch (autoSizeTextType) {
@@ -262,7 +262,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setAutoSizeTextTypeUniformWithConfiguration(
int autoSizeMinTextSize,
int autoSizeMaxTextSize,
@@ -308,7 +308,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
throws IllegalArgumentException {
if (supportsAutoSizeText()) {
@@ -358,7 +358,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@TextViewCompat.AutoSizeTextType
int getAutoSizeTextType() {
return mAutoSizeTextType;
@@ -373,7 +373,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
int getAutoSizeStepGranularity() {
return Math.round(mAutoSizeStepGranularityInPx);
}
@@ -389,7 +389,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
int getAutoSizeMinTextSize() {
return Math.round(mAutoSizeMinTextSizeInPx);
}
@@ -405,7 +405,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
int getAutoSizeMaxTextSize() {
return Math.round(mAutoSizeMaxTextSizeInPx);
}
@@ -418,7 +418,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
int[] getAutoSizeTextAvailableSizes() {
return mAutoSizeTextSizesInPx;
}
@@ -541,7 +541,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void autoSizeText() {
if (!isAutoSizeEnabled()) {
return;
@@ -590,7 +590,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setTextSizeInternal(int unit, float size) {
Resources res = mContext == null
? Resources.getSystem()
@@ -855,7 +855,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
boolean isAutoSizeEnabled() {
return supportsAutoSizeText()
&& mAutoSizeTextType != TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java b/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java
index 2a4a0ce..40e7748 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java
@@ -15,7 +15,7 @@
*/
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ButtonBarLayout extends LinearLayout {
/** Amount of the second button to "peek" above the fold when stacked. */
private static final int PEEK_BUTTON_DP = 16;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java b/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
index 6f20da1..3d77e91 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
@@ -21,7 +21,7 @@
import static android.view.View.MeasureSpec.getMode;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Rect;
@@ -71,7 +71,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void dispatchFitSystemWindows(Rect insets) {
fitSystemWindows(insets);
}
@@ -86,7 +86,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setDecorPadding(int left, int top, int right, int bottom) {
mDecorPadding.set(left, top, right, bottom);
if (ViewCompat.isLaidOut(this)) {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/DecorContentParent.java b/appcompat/src/main/java/androidx/appcompat/widget/DecorContentParent.java
index af14904..bb92dbd 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/DecorContentParent.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/DecorContentParent.java
@@ -17,7 +17,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface DecorContentParent {
void setWindowCallback(Window.Callback cb);
void setWindowTitle(CharSequence title);
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/DecorToolbar.java b/appcompat/src/main/java/androidx/appcompat/widget/DecorToolbar.java
index 9b69e9e..d685b63 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/DecorToolbar.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/DecorToolbar.java
@@ -17,7 +17,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -42,7 +42,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface DecorToolbar {
ViewGroup getViewGroup();
Context getContext();
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java b/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java
index 0a20e81f..63b117b 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class DialogTitle extends AppCompatTextView {
public DialogTitle(Context context, AttributeSet attrs, int defStyleAttr) {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java b/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java
index 144a462..59f590f 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Rect;
@@ -28,7 +28,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class FitWindowsFrameLayout extends FrameLayout implements FitWindowsViewGroup {
private OnFitSystemWindowsListener mListener;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java b/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java
index 6006a80..dbea5ba 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Rect;
@@ -28,7 +28,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class FitWindowsLinearLayout extends LinearLayout implements FitWindowsViewGroup {
private OnFitSystemWindowsListener mListener;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsViewGroup.java b/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsViewGroup.java
index 9561a11..c2e13d5 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsViewGroup.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsViewGroup.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
@@ -25,7 +25,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface FitWindowsViewGroup {
interface OnFitSystemWindowsListener {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ForwardingListener.java b/appcompat/src/main/java/androidx/appcompat/widget/ForwardingListener.java
index 3c5959f..e96af27 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ForwardingListener.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ForwardingListener.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.SystemClock;
import android.view.MotionEvent;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class ForwardingListener
implements View.OnTouchListener, View.OnAttachStateChangeListener {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java b/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
index f30aad7..0b6cf15 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
@@ -17,7 +17,7 @@
package androidx.appcompat.widget;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -56,7 +56,7 @@
*/
public class LinearLayoutCompat extends ViewGroup {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({HORIZONTAL, VERTICAL})
@Retention(RetentionPolicy.SOURCE)
public @interface OrientationMode {}
@@ -65,7 +65,7 @@
public static final int VERTICAL = 1;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(flag = true,
value = {
SHOW_DIVIDER_NONE,
@@ -273,7 +273,7 @@
*
* @hide Used internally by framework.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getDividerWidth() {
return mDividerWidth;
}
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java b/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
index b7db4cd..056213e 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -346,7 +346,7 @@
*
* @hide Used only by AutoCompleteTextView to handle some internal special cases.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) {
mForceIgnoreOutsideTouch = forceIgnoreOutsideTouch;
}
@@ -362,7 +362,7 @@
*
* @hide Only used by AutoCompleteTextView under special conditions.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) {
mDropDownAlwaysVisible = dropDownAlwaysVisible;
}
@@ -372,7 +372,7 @@
*
* @hide Only used by AutoCompleteTextView under special conditions.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isDropDownAlwaysVisible() {
return mDropDownAlwaysVisible;
}
@@ -501,15 +501,25 @@
}
/**
- * Specifies the anchor-relative bounds of the popup's transition
+ * Specifies the custom anchor-relative bounds of the popup's transition
* epicenter.
*
- * @param bounds anchor-relative bounds
- * @hide
+ * @param bounds anchor-relative bounds or {@code null} to use default epicenter
+ * @see #getEpicenterBounds()
*/
- @RestrictTo(LIBRARY_GROUP)
- public void setEpicenterBounds(Rect bounds) {
- mEpicenterBounds = bounds;
+ public void setEpicenterBounds(@Nullable Rect bounds) {
+ mEpicenterBounds = bounds != null ? new Rect(bounds) : null;
+ }
+
+ /**
+ * Return custom anchor-relative bounds of the popup's transition epicenter
+ *
+ * @return anchor-relative bounds, or @{@code null} if not set
+ * @see #setEpicenterBounds(Rect)
+ */
+ @Nullable
+ public Rect getEpicenterBounds() {
+ return mEpicenterBounds != null ? new Rect(mEpicenterBounds) : null;
}
/**
@@ -1313,7 +1323,7 @@
* @hide Only used by {@link androidx.appcompat.view.menu.CascadingMenuPopup} to position
* a submenu correctly.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setOverlapAnchor(boolean overlapAnchor) {
mOverlapAnchorSet = true;
mOverlapAnchor = overlapAnchor;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java b/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java
index f61f9d8..9d09898 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.MenuItem;
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface MenuItemHoverListener {
/**
* Called when hover exits a menu item.
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java b/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
index ebae836..aa8295a 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Configuration;
@@ -49,7 +49,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MenuPopupWindow extends ListPopupWindow implements MenuItemHoverListener {
private static final String TAG = "MenuPopupWindow";
@@ -126,7 +126,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class MenuDropDownListView extends DropDownListView {
final int mAdvanceKey;
final int mRetreatKey;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java b/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
index 13acde3..bd207d0 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.view.Gravity;
@@ -301,7 +301,7 @@
* @return The view representing the list of menu items.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
ListView getMenuListView() {
if (!mPopup.isShowing()) {
return null;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java b/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java
index 2fdf7d4..6f22484 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java
@@ -15,7 +15,7 @@
*/
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -54,7 +54,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ScrollingTabContainerView extends HorizontalScrollView
implements AdapterView.OnItemSelectedListener {
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java b/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
index b7798e9..364f2cb 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.appcompat.widget.SuggestionsAdapter.getColumnString;
import android.app.PendingIntent;
@@ -423,7 +423,7 @@
* @param appSearchData bundle provided by the app when launching the search dialog
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setAppSearchData(Bundle appSearchData) {
mAppSearchData = appSearchData;
}
@@ -1819,7 +1819,7 @@
* Local subclass for AutoCompleteTextView.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class SearchAutoComplete extends AppCompatAutoCompleteTextView {
private int mThreshold;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/SuggestionsAdapter.java b/appcompat/src/main/java/androidx/appcompat/widget/SuggestionsAdapter.java
index 4a8e6c5..635176a 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/SuggestionsAdapter.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/SuggestionsAdapter.java
@@ -16,7 +16,6 @@
* limitations under the License.
*/
-import android.annotation.SuppressLint;
import android.app.SearchManager;
import android.app.SearchableInfo;
import android.content.ComponentName;
@@ -90,7 +89,6 @@
// private final Runnable mStartSpinnerRunnable;
// private final Runnable mStopSpinnerRunnable;
- @SuppressLint("RestrictedApi")
public SuggestionsAdapter(Context context, SearchView searchView, SearchableInfo searchable,
WeakHashMap<String, Drawable.ConstantState> outsideDrawablesCache) {
super(context, searchView.getSuggestionRowLayout(), null /* no initial cursor */,
@@ -333,7 +331,6 @@
}
}
- @SuppressLint("RestrictedApi")
private CharSequence formatUrl(CharSequence url) {
if (mUrlColor == null) {
// Lazily get the URL color from the current theme.
@@ -447,7 +444,6 @@
* @see android.widget.ListAdapter#getView(int, View, ViewGroup)
*/
@Override
- @SuppressLint("RestrictedApi")
public View getView(int position, View convertView, ViewGroup parent) {
try {
return super.getView(position, convertView, parent);
@@ -471,7 +467,6 @@
* @see android.widget.CursorAdapter#getDropDownView(int, View, ViewGroup)
*/
@Override
- @SuppressLint("RestrictedApi")
public View getDropDownView(int position, View convertView, ViewGroup parent) {
try {
return super.getDropDownView(position, convertView, parent);
@@ -605,7 +600,6 @@
* @param cursor A cursor positioned at the current suggestion.
* @return A non-null drawable.
*/
- @SuppressLint("RestrictedApi")
private Drawable getDefaultIcon1(Cursor cursor) {
// Check the component that gave us the suggestion
Drawable drawable = getActivityIconWithCache(mSearchable.getSearchActivity());
@@ -648,7 +642,6 @@
* @return A drawable, or {@code null} if neither the activity or the application
* have an icon set.
*/
- @SuppressLint("RestrictedApi")
private Drawable getActivityIcon(ComponentName component) {
PackageManager pm = mContext.getPackageManager();
final ActivityInfo activityInfo;
@@ -701,7 +694,6 @@
* Import of hidden method: ContentResolver.getResourceId(Uri).
* Modified to return a drawable, rather than a hidden type.
*/
- @SuppressLint("RestrictedApi")
Drawable getDrawableFromResourceUri(Uri uri) throws FileNotFoundException {
String authority = uri.getAuthority();
Resources r;
@@ -740,7 +732,6 @@
/**
* Import of hidden method: SearchManager.getSuggestions(SearchableInfo, String, int).
*/
- @SuppressLint("RestrictedApi")
Cursor getSearchManagerSuggestions(SearchableInfo searchable, String query, int limit) {
if (searchable == null) {
return null;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java b/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java
index ba1fdf1..d0038bc 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -41,7 +41,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TintTypedArray {
private final Context mContext;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 7018bfc..2754164 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.annotation.RestrictTo.Scope.TESTS;
import android.content.Context;
@@ -140,6 +140,7 @@
* {@link androidx.appcompat.R.attr#titleMarginTop}
* {@link androidx.appcompat.R.attr#titleTextAppearance}
* {@link androidx.appcompat.R.attr#titleTextColor}
+ * {@link androidx.appcompat.R.attr#menu}
*/
public class Toolbar extends ViewGroup {
private static final String TAG = "Toolbar";
@@ -341,6 +342,11 @@
if (a.hasValue(R.styleable.Toolbar_subtitleTextColor)) {
setSubtitleTextColor(a.getColorStateList(R.styleable.Toolbar_subtitleTextColor));
}
+
+ if (a.hasValue(R.styleable.Toolbar_menu)) {
+ inflateMenu(a.getResourceId(R.styleable.Toolbar_menu, 0));
+ }
+
a.recycle();
}
@@ -504,7 +510,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean canShowOverflowMenu() {
return getVisibility() == VISIBLE && mMenuView != null && mMenuView.isOverflowReserved();
}
@@ -520,7 +526,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isOverflowMenuShowPending() {
return mMenuView != null && mMenuView.isOverflowMenuShowPending();
}
@@ -544,7 +550,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setMenu(MenuBuilder menu, ActionMenuPresenter outerPresenter) {
if (menu == null && mMenuView == null) {
return;
@@ -590,7 +596,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isTitleTruncated() {
if (mTitleTextView == null) {
return false;
@@ -1114,6 +1120,7 @@
* an XML menu resource, use {@link #inflateMenu(int)}.</p>
*
* @return The toolbar's Menu
+ * {@link androidx.appcompat.R.attr#menu}
*/
public Menu getMenu() {
ensureMenu();
@@ -1178,6 +1185,7 @@
* be modified or removed.</p>
*
* @param resId ID of a menu resource to inflate
+ * {@link androidx.appcompat.R.attr#menu}
*/
public void inflateMenu(@MenuRes int resId) {
getMenuInflater().inflate(resId, getMenu());
@@ -2218,7 +2226,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public DecorToolbar getWrapper() {
if (mWrapper == null) {
mWrapper = new ToolbarWidgetWrapper(this, true);
@@ -2257,7 +2265,7 @@
* it could be considered "empty" (no visible elements with nonzero measured size)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setCollapsible(boolean collapsible) {
mCollapsible = collapsible;
requestLayout();
@@ -2267,7 +2275,7 @@
* Must be called before the menu is accessed
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {
mActionMenuPresenterCallback = pcb;
mMenuBuilderCallback = mcb;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java b/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java
index 0efc3a2..1fb1451 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java
@@ -17,7 +17,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.ActionBar;
import android.content.Context;
@@ -58,7 +58,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ToolbarWidgetWrapper implements DecorToolbar {
private static final String TAG = "ToolbarWidgetWrapper";
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java b/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java
index a970202..401abaf 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java
@@ -18,7 +18,7 @@
import static android.view.View.SYSTEM_UI_FLAG_LOW_PROFILE;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.text.TextUtils;
@@ -38,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class TooltipCompatHandler implements View.OnLongClickListener, View.OnHoverListener,
View.OnAttachStateChangeListener {
private static final String TAG = "TooltipCompatHandler";
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java b/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java
index c714000..6697a11 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.content.Context;
@@ -41,7 +41,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class TooltipPopup {
private static final String TAG = "TooltipPopup";
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java b/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java
index 06fb0f8..4473648 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -39,7 +39,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class ViewStubCompat extends View {
private int mLayoutResource = 0;
private int mInflatedId;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java b/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
index 497eb78..ef43e50 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.os.Build;
@@ -32,7 +32,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ViewUtils {
private static final String TAG = "ViewUtils";
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java b/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java
index f9069bd..2672ea7 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java
@@ -16,7 +16,7 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
@@ -24,7 +24,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface WithHint {
/**
* Returns the hint which is displayed in the floating label, if enabled.
diff --git a/arch/core-common/build.gradle b/arch/core-common/build.gradle
index 81a34ad..5966b65 100644
--- a/arch/core-common/build.gradle
+++ b/arch/core-common/build.gradle
@@ -24,7 +24,7 @@
}
dependencies {
- compile(SUPPORT_ANNOTATIONS)
+ compile(project(":annotation"))
testCompile(JUNIT)
testCompile(MOCKITO_CORE)
diff --git a/arch/core-common/src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java b/arch/core-common/src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java
index c3a9086..c53ff9a 100644
--- a/arch/core-common/src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java
+++ b/arch/core-common/src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java
@@ -31,7 +31,7 @@
* @param <V> Value type
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class FastSafeIterableMap<K, V> extends SafeIterableMap<K, V> {
private HashMap<K, Entry<K, V>> mHashMap = new HashMap<>();
diff --git a/arch/core-common/src/main/java/androidx/arch/core/internal/SafeIterableMap.java b/arch/core-common/src/main/java/androidx/arch/core/internal/SafeIterableMap.java
index ff1cbda..a7bd54f 100644
--- a/arch/core-common/src/main/java/androidx/arch/core/internal/SafeIterableMap.java
+++ b/arch/core-common/src/main/java/androidx/arch/core/internal/SafeIterableMap.java
@@ -31,7 +31,7 @@
* @param <V> Value type
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class SafeIterableMap<K, V> implements Iterable<Map.Entry<K, V>> {
@SuppressWarnings("WeakerAccess") /* synthetic access */
diff --git a/arch/core-runtime/build.gradle b/arch/core-runtime/build.gradle
index 0010920..7091d76 100644
--- a/arch/core-runtime/build.gradle
+++ b/arch/core-runtime/build.gradle
@@ -24,7 +24,7 @@
}
dependencies {
- api(SUPPORT_ANNOTATIONS)
+ api(project(":annotation"))
api(project(":arch:core-common"))
}
diff --git a/arch/core-runtime/src/main/java/androidx/arch/core/executor/ArchTaskExecutor.java b/arch/core-runtime/src/main/java/androidx/arch/core/executor/ArchTaskExecutor.java
index a38dff8..cdeb07f 100644
--- a/arch/core-runtime/src/main/java/androidx/arch/core/executor/ArchTaskExecutor.java
+++ b/arch/core-runtime/src/main/java/androidx/arch/core/executor/ArchTaskExecutor.java
@@ -28,7 +28,7 @@
*
* @hide This API is not final.
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ArchTaskExecutor extends TaskExecutor {
private static volatile ArchTaskExecutor sInstance;
diff --git a/arch/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java b/arch/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java
index c9fb85a..3b7aa69 100644
--- a/arch/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java
+++ b/arch/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java
@@ -33,7 +33,7 @@
/**
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class DefaultTaskExecutor extends TaskExecutor {
private final Object mLock = new Object();
diff --git a/arch/core-runtime/src/main/java/androidx/arch/core/executor/TaskExecutor.java b/arch/core-runtime/src/main/java/androidx/arch/core/executor/TaskExecutor.java
index 4b3c5fa..090736e 100644
--- a/arch/core-runtime/src/main/java/androidx/arch/core/executor/TaskExecutor.java
+++ b/arch/core-runtime/src/main/java/androidx/arch/core/executor/TaskExecutor.java
@@ -27,7 +27,7 @@
* TODO: Don't use this from outside, we don't know what the API will look like yet.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class TaskExecutor {
/**
* Executes the given task in the disk IO thread pool.
diff --git a/arch/core-testing/build.gradle b/arch/core-testing/build.gradle
index f733c36..2dec495 100644
--- a/arch/core-testing/build.gradle
+++ b/arch/core-testing/build.gradle
@@ -25,7 +25,7 @@
dependencies {
api(project(":arch:core-runtime"))
- api(SUPPORT_ANNOTATIONS)
+ api(project(":annotation"))
api(JUNIT)
api(MOCKITO_CORE, libs.exclude_bytebuddy)
diff --git a/arch/core-testing/src/main/java/androidx/arch/core/executor/JunitTaskExecutorRule.java b/arch/core-testing/src/main/java/androidx/arch/core/executor/JunitTaskExecutorRule.java
index 1a09d1e..94ebb2b 100644
--- a/arch/core-testing/src/main/java/androidx/arch/core/executor/JunitTaskExecutorRule.java
+++ b/arch/core-testing/src/main/java/androidx/arch/core/executor/JunitTaskExecutorRule.java
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class JunitTaskExecutorRule implements TestRule {
private final TaskExecutorWithFakeMainThread mTaskExecutor;
diff --git a/arch/core-testing/src/main/java/androidx/arch/core/executor/TaskExecutorWithFakeMainThread.java b/arch/core-testing/src/main/java/androidx/arch/core/executor/TaskExecutorWithFakeMainThread.java
index d855a08..89e969b 100644
--- a/arch/core-testing/src/main/java/androidx/arch/core/executor/TaskExecutorWithFakeMainThread.java
+++ b/arch/core-testing/src/main/java/androidx/arch/core/executor/TaskExecutorWithFakeMainThread.java
@@ -36,7 +36,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@SuppressLint("SyntheticAccessor")
public class TaskExecutorWithFakeMainThread extends TaskExecutor {
@SuppressWarnings("WeakerAccess") /* synthetic access */
diff --git a/asynclayoutinflater/api/1.1.0-alpha01.txt b/asynclayoutinflater/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..a729b12
--- /dev/null
+++ b/asynclayoutinflater/api/1.1.0-alpha01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.asynclayoutinflater.view {
+
+ public final class AsyncLayoutInflater {
+ ctor public AsyncLayoutInflater(android.content.Context);
+ method @UiThread public void inflate(@LayoutRes int, android.view.ViewGroup?, androidx.asynclayoutinflater.view.AsyncLayoutInflater.OnInflateFinishedListener);
+ }
+
+ public static interface AsyncLayoutInflater.OnInflateFinishedListener {
+ method public void onInflateFinished(android.view.View, @LayoutRes int, android.view.ViewGroup?);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/asynclayoutinflater/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to asynclayoutinflater/api/res-1.1.0-alpha01.txt
diff --git a/browser/OWNERS b/browser/OWNERS
index a0bf18a..b6d0e07 100644
--- a/browser/OWNERS
+++ b/browser/OWNERS
@@ -1,2 +1,2 @@
lizeb@google.com
-yusufo@google.com
\ No newline at end of file
+peconn@google.com
diff --git a/browser/api/1.0.0.txt b/browser/api/1.1.0-alpha01.txt
similarity index 97%
rename from browser/api/1.0.0.txt
rename to browser/api/1.1.0-alpha01.txt
index a1ecbdd..6d5793a 100644
--- a/browser/api/1.0.0.txt
+++ b/browser/api/1.1.0-alpha01.txt
@@ -4,14 +4,15 @@
public class BrowserActionItem {
ctor public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
ctor public BrowserActionItem(String, android.app.PendingIntent);
- method public android.app.PendingIntent! getAction();
+ method public android.app.PendingIntent getAction();
method public int getIconId();
- method public String! getTitle();
+ method public String getTitle();
}
public class BrowserActionsIntent {
- method public static String! getCreatorPackageName(android.content.Intent!);
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
method public android.content.Intent getIntent();
+ method public static String? getUntrustedCreatorPackageName(android.content.Intent);
method public static void launchIntent(android.content.Context!, android.content.Intent!);
method public static void openBrowserAction(android.content.Context!, android.net.Uri!);
method public static void openBrowserAction(android.content.Context!, android.net.Uri!, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem>!, android.app.PendingIntent!);
@@ -72,7 +73,7 @@
method public static boolean connectAndInitialize(android.content.Context!, String!);
method public android.os.Bundle! extraCommand(String!, android.os.Bundle!);
method public static String! getPackageName(android.content.Context!, java.util.List<java.lang.String>?);
- method public static String! getPackageName(android.content.Context!, java.util.List<java.lang.String>?, boolean);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String>?, boolean);
method public androidx.browser.customtabs.CustomTabsSession! newSession(androidx.browser.customtabs.CustomTabsCallback!);
method public boolean warmup(long);
}
diff --git a/browser/api/current.txt b/browser/api/current.txt
index a1ecbdd..6d5793a 100644
--- a/browser/api/current.txt
+++ b/browser/api/current.txt
@@ -4,14 +4,15 @@
public class BrowserActionItem {
ctor public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
ctor public BrowserActionItem(String, android.app.PendingIntent);
- method public android.app.PendingIntent! getAction();
+ method public android.app.PendingIntent getAction();
method public int getIconId();
- method public String! getTitle();
+ method public String getTitle();
}
public class BrowserActionsIntent {
- method public static String! getCreatorPackageName(android.content.Intent!);
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
method public android.content.Intent getIntent();
+ method public static String? getUntrustedCreatorPackageName(android.content.Intent);
method public static void launchIntent(android.content.Context!, android.content.Intent!);
method public static void openBrowserAction(android.content.Context!, android.net.Uri!);
method public static void openBrowserAction(android.content.Context!, android.net.Uri!, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem>!, android.app.PendingIntent!);
@@ -72,7 +73,7 @@
method public static boolean connectAndInitialize(android.content.Context!, String!);
method public android.os.Bundle! extraCommand(String!, android.os.Bundle!);
method public static String! getPackageName(android.content.Context!, java.util.List<java.lang.String>?);
- method public static String! getPackageName(android.content.Context!, java.util.List<java.lang.String>?, boolean);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String>?, boolean);
method public androidx.browser.customtabs.CustomTabsSession! newSession(androidx.browser.customtabs.CustomTabsCallback!);
method public boolean warmup(long);
}
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/browser/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to browser/api/res-1.1.0-alpha01.txt
diff --git a/browser/build.gradle b/browser/build.gradle
index c8a3fca..feed454 100644
--- a/browser/build.gradle
+++ b/browser/build.gradle
@@ -8,7 +8,7 @@
android {
defaultConfig {
- minSdkVersion 15
+ minSdkVersion 16
}
}
@@ -19,6 +19,8 @@
api(project(":collection"))
api(project(":legacy-support-core-ui"))
+ implementation(project(":concurrent:concurrent-futures"))
+
androidTestImplementation(TEST_EXT_JUNIT)
androidTestImplementation(TEST_CORE)
androidTestImplementation(TEST_RUNNER)
diff --git a/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java b/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
index 0d5ed92..1ed34b8 100644
--- a/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
+++ b/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
@@ -31,6 +31,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
+import androidx.testutils.PollingCheck;
import org.junit.Before;
import org.junit.Rule;
@@ -54,11 +55,18 @@
new ActivityTestRule<>(TestActivity.class);
private Context mContext;
private List<BrowserActionItem> mMenuItems;
+ private List<String> mMenuItemTitles;
@Before
public void setup() {
mContext = mActivityTestRule.getActivity();
mMenuItems = createMenuItems();
+ mMenuItemTitles = new ArrayList<>();
+ mMenuItemTitles.add(mContext.getString(R.string.fallback_menu_item_open_in_browser));
+ mMenuItemTitles.add(mContext.getString(R.string.fallback_menu_item_copy_link));
+ mMenuItemTitles.add(mContext.getString(R.string.fallback_menu_item_share_link));
+ mMenuItemTitles.add(CUSTOM_ITEM_TITLE_1);
+ mMenuItemTitles.add(CUSTOM_ITEM_TITLE_2);
}
private List<BrowserActionItem> createMenuItems() {
@@ -130,15 +138,19 @@
(TextView) contentView.findViewById(R.id.browser_actions_header_text);
assertNotNull(urlTextView);
assertEquals(TEST_URL, urlTextView.getText());
- ListView menuListView =
+ final ListView menuListView =
(ListView) contentView.findViewById(R.id.browser_actions_menu_items);
assertNotNull(menuListView);
- assertEquals(2, menuListView.getCount());
- TextView menuItemTitleView1 = (TextView) menuListView.getChildAt(0).findViewById(
- R.id.browser_actions_menu_item_text);
- assertEquals(CUSTOM_ITEM_TITLE_1, menuItemTitleView1.getText());
- TextView menuItemTitleView2 = (TextView) menuListView.getChildAt(1).findViewById(
- R.id.browser_actions_menu_item_text);
- assertEquals(CUSTOM_ITEM_TITLE_2, menuItemTitleView2.getText());
+ PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+ @Override
+ public boolean canProceed() {
+ return mMenuItemTitles.size() == menuListView.getCount();
+ }
+ });
+ for (int i = 0; i < mMenuItemTitles.size(); i++) {
+ TextView menuItemTitleView = (TextView) menuListView.getChildAt(i).findViewById(
+ R.id.browser_actions_menu_item_text);
+ assertEquals(mMenuItemTitles.get(i), menuItemTitleView.getText());
+ }
}
-}
+}
\ No newline at end of file
diff --git a/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java b/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
index 69bed08..9311270 100644
--- a/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
+++ b/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
@@ -62,7 +62,8 @@
assertEquals(BrowserActionsIntent.URL_TYPE_NONE,
intent.getIntExtra(BrowserActionsIntent.EXTRA_TYPE, 0));
assertTrue(intent.hasExtra(BrowserActionsIntent.EXTRA_APP_ID));
- assertEquals(mContext.getPackageName(), BrowserActionsIntent.getCreatorPackageName(intent));
+ assertEquals(mContext.getPackageName(),
+ BrowserActionsIntent.getUntrustedCreatorPackageName(intent));
assertFalse(intent.hasExtra(BrowserActionsIntent.EXTRA_SELECTED_ACTION_PENDING_INTENT));
}
diff --git a/browser/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java b/browser/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java
index 66b7230..3adef06 100644
--- a/browser/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java
+++ b/browser/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java
@@ -24,6 +24,7 @@
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -37,9 +38,9 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
-
/**
* Tests for a complete loop between a browser side {@link CustomTabsService}
* and a client side {@link PostMessageService}. Both services are bound to through
@@ -50,6 +51,8 @@
@LargeTest
public class PostMessageTest {
@Rule
+ public final ServiceTestRule mServiceRule;
+ @Rule
public final ActivityTestRule<TestActivity> mActivityTestRule;
private TestCustomTabsCallback mCallback;
private Context mContext;
@@ -61,6 +64,7 @@
public PostMessageTest() {
mActivityTestRule = new ActivityTestRule<TestActivity>(TestActivity.class);
+ mServiceRule = new ServiceTestRule();
mCustomTabsServiceConnected = new AtomicBoolean(false);
}
@@ -73,15 +77,21 @@
@Override
public void extraCallback(String callbackName, Bundle args) {
if (TestCustomTabsService.CALLBACK_BIND_TO_POST_MESSAGE.equals(callbackName)) {
- Intent postMessageServiceIntent = new Intent();
- postMessageServiceIntent.setClassName(
- mContext.getPackageName(), PostMessageService.class.getName());
- try {
- mContext.bindService(postMessageServiceIntent,
- mPostMessageServiceConnection, Context.BIND_AUTO_CREATE);
- } catch (Exception e) {
- fail();
- }
+ // This gets run on the UI thread, where mServiceRule.bindService will not work.
+ AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Intent postMessageServiceIntent = new Intent();
+ postMessageServiceIntent.setClassName(mContext.getPackageName(),
+ PostMessageService.class.getName());
+ mServiceRule.bindService(postMessageServiceIntent,
+ mPostMessageServiceConnection, Context.BIND_AUTO_CREATE);
+ } catch (TimeoutException e) {
+ fail();
+ }
+ }
+ });
}
}
};
@@ -89,8 +99,8 @@
mCustomTabsServiceConnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
- mSession = client.newSession(mCallback);
mCustomTabsServiceConnected.set(true);
+ mSession = client.newSession(mCallback);
}
@Override
@@ -114,9 +124,9 @@
customTabsServiceIntent.setClassName(
mContext.getPackageName(), TestCustomTabsService.class.getName());
try {
- mContext.bindService(customTabsServiceIntent,
+ mServiceRule.bindService(customTabsServiceIntent,
mCustomTabsServiceConnection, Context.BIND_AUTO_CREATE);
- } catch (Exception e) {
+ } catch (TimeoutException e) {
fail();
}
}
diff --git a/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java b/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java
index 7c48245..6353398 100644
--- a/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java
+++ b/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java
@@ -55,7 +55,7 @@
@Override
public void onRelationshipValidationResult(int relation, Uri origin, boolean result,
- Bundle extras) throws RemoteException {
+ Bundle extras) throws RemoteException {
TestCustomTabsCallback.this.onRelationshipValidationResult(
relation, origin, result, extras);
}
diff --git a/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java b/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java
index c3057b2f..071d1c2 100644
--- a/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java
+++ b/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java
@@ -43,7 +43,7 @@
@Override
protected boolean mayLaunchUrl(CustomTabsSessionToken sessionToken,
- Uri url, Bundle extras, List<Bundle> otherLikelyBundles) {
+ Uri url, Bundle extras, List<Bundle> otherLikelyBundles) {
return false;
}
@@ -74,7 +74,7 @@
@Override
protected boolean validateRelationship(CustomTabsSessionToken sessionToken,
- @Relation int relation, Uri origin, Bundle extras) {
+ @Relation int relation, Uri origin, Bundle extras) {
return false;
}
}
diff --git a/browser/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl b/browser/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
index 3e2c48c..a5dd8ea 100644
--- a/browser/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
+++ b/browser/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
@@ -28,4 +28,4 @@
void onMessageChannelReady(in Bundle extras) = 3;
void onPostMessage(String message, in Bundle extras) = 4;
void onRelationshipValidationResult(int relation, in Uri origin, boolean result, in Bundle extras) = 5;
-}
+}
\ No newline at end of file
diff --git a/browser/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl b/browser/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
index 376c2a4..c89d9db 100644
--- a/browser/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
+++ b/browser/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
@@ -37,4 +37,4 @@
boolean requestPostMessageChannel(in ICustomTabsCallback callback, in Uri postMessageOrigin) = 6;
int postMessage(in ICustomTabsCallback callback, String message, in Bundle extras) = 7;
boolean validateRelationship(in ICustomTabsCallback callback, int relation, in Uri origin, in Bundle extras) = 8;
-}
+}
\ No newline at end of file
diff --git a/browser/src/main/aidl/android/support/customtabs/IPostMessageService.aidl b/browser/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
index 2c8a605c..666fe83c 100644
--- a/browser/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
+++ b/browser/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
@@ -27,4 +27,4 @@
interface IPostMessageService {
void onMessageChannelReady(in ICustomTabsCallback callback, in Bundle extras) = 1;
void onPostMessage(in ICustomTabsCallback callback, String message, in Bundle extras) = 2;
-}
+}
\ No newline at end of file
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
index 4b657c4..c79ad83 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
@@ -16,10 +16,16 @@
package androidx.browser.browseractions;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+
import android.app.PendingIntent;
+import android.net.Uri;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
/**
* A wrapper class holding custom item of Browser Actions menu.
@@ -29,7 +35,9 @@
private final String mTitle;
private final PendingIntent mAction;
@DrawableRes
- private final int mIconId;
+ private int mIconId;
+ private Uri mIconUri;
+ private Runnable mRunnableAction;
/**
* Constructor for BrowserActionItem with icon, string and action provided.
@@ -45,6 +53,35 @@
}
/**
+ * Constructor for BrowserActionItem with icon access through a uri.
+ * @param title The string shown for a custom item.
+ * @param action The PendingIntent executed when a custom item is selected
+ * @param iconUri The {@link Uri} used to access the icon file. Note: make sure this is
+ * generated from {@link BrowserServiceFileProvider.generateUri(Context, Bitmap, String,
+ * int, List<ResolveInfo>)}.
+ */
+ /** @hide */
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
+ public BrowserActionItem(
+ @NonNull String title, @NonNull PendingIntent action, @NonNull Uri iconUri) {
+ mTitle = title;
+ mAction = action;
+ mIconUri = iconUri;
+ }
+
+ /**
+ * Constructs a predefined fallback menu item with a Runnable action. The item will have no
+ * icon and no custom PendingIntent action.
+ * @param title The title of the menu item.
+ * @param action The {@link Runnable} action to be executed when user choose the item.
+ */
+ BrowserActionItem(@NonNull String title, @NonNull Runnable action) {
+ mTitle = title;
+ mAction = null;
+ mRunnableAction = action;
+ }
+
+ /**
* Constructor for BrowserActionItem with only string and action provided.
* @param title The icon shown for a custom item.
* @param action The string shown for a custom item.
@@ -63,6 +100,7 @@
/**
* @return The title of a custom item.
*/
+ @NonNull
public String getTitle() {
return mTitle;
}
@@ -70,7 +108,28 @@
/**
* @return The action of a custom item.
*/
+ @NonNull
public PendingIntent getAction() {
return mAction;
}
+
+ /**
+ * @return The uri used to get the icon of a custom item.
+ * @hide
+ */
+ @RestrictTo(LIBRARY)
+ @Nullable
+ public Uri getIconUri() {
+ return mIconUri;
+ }
+
+ /**
+ * @return The {@link Runnable} action of a predefined fallback menu item.
+ */
+ /** @hide */
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
+ @Nullable
+ Runnable getRunnableAction() {
+ return mRunnableAction;
+ }
}
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java
index a82ecc2..a1756eb 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java
@@ -17,7 +17,9 @@
package androidx.browser.browseractions;
import android.content.Context;
+import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -28,7 +30,11 @@
import androidx.browser.R;
import androidx.core.content.res.ResourcesCompat;
+import com.google.common.util.concurrent.ListenableFuture;
+
import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
/**
* The adapter to display the icon and title of custom Browser Actions item.
@@ -60,7 +66,7 @@
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final BrowserActionItem menuItem = mMenuItems.get(position);
- ViewHolderItem viewHolder;
+ final ViewHolderItem viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.browser_actions_context_menu_row, null);
@@ -74,13 +80,47 @@
viewHolder = (ViewHolderItem) convertView.getTag();
}
- viewHolder.mText.setText(menuItem.getTitle());
+ final String titleText = menuItem.getTitle();
+ viewHolder.mText.setText(titleText);
if (menuItem.getIconId() != 0) {
Drawable drawable = ResourcesCompat.getDrawable(
mContext.getResources(), menuItem.getIconId(), null);
viewHolder.mIcon.setImageDrawable(drawable);
+ } else if (menuItem.getIconUri() != null) {
+ final ListenableFuture<Bitmap> bitmapFuture = BrowserServiceFileProvider
+ .loadBitmap(mContext.getContentResolver(), menuItem.getIconUri());
+
+ bitmapFuture.addListener(new Runnable() {
+ @Override
+ public void run() {
+ // ViewHolder has been reused by other item.
+ if (!TextUtils.equals(titleText, viewHolder.mText.getText())) return;
+
+ Bitmap bitmap = null;
+ try {
+ bitmap = bitmapFuture.get();
+ } catch (ExecutionException | InterruptedException e) {
+ // Ignore and just don't use the image.
+ }
+
+ if (bitmap != null) {
+ viewHolder.mIcon.setVisibility(View.VISIBLE);
+ viewHolder.mIcon.setImageBitmap(bitmap);
+ } else {
+ viewHolder.mIcon.setVisibility(View.INVISIBLE);
+ viewHolder.mIcon.setImageBitmap(null);
+ }
+ }
+ }, new Executor() {
+ @Override
+ public void execute(Runnable runnable) {
+ runnable.run();
+ }
+ });
+
} else {
- viewHolder.mIcon.setImageDrawable(null);
+ viewHolder.mIcon.setImageBitmap(null);
+ viewHolder.mIcon.setVisibility(View.INVISIBLE);
}
return convertView;
}
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java
index 270efd6..bcc0099 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java
@@ -16,12 +16,15 @@
package androidx.browser.browseractions;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
+import android.content.ClipData;
+import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
@@ -30,12 +33,14 @@
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
+import android.widget.Toast;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
import androidx.browser.R;
import androidx.core.widget.TextViewCompat;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -44,15 +49,18 @@
class BrowserActionsFallbackMenuUi implements AdapterView.OnItemClickListener {
/** @hide */
@VisibleForTesting
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
interface BrowserActionsFallMenuUiListener {
void onMenuShown(View view);
}
private static final String TAG = "BrowserActionskMenuUi";
- private final Context mContext;
- private final Uri mUri;
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ final Context mContext;
+
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ final Uri mUri;
private final List<BrowserActionItem> mMenuItems;
@SuppressWarnings("WeakerAccess") /* synthetic access */
@@ -63,22 +71,61 @@
/**
* @param context The {@link Context} used to show the fallback menu.
* @param uri The uri which users click to trigger the menu.
- * @param menuItems The custom menu items shown in the menu.
+ * @param customItems The custom menu items shown in the menu.
*/
- BrowserActionsFallbackMenuUi(
- Context context, Uri uri, List<BrowserActionItem> menuItems) {
+ BrowserActionsFallbackMenuUi(Context context, Uri uri, List<BrowserActionItem> customItems) {
mContext = context;
mUri = uri;
- mMenuItems = menuItems;
+ mMenuItems = buildFallbackMenuItemList(context, customItems);
}
/** @hide */
@VisibleForTesting
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setMenuUiListener(BrowserActionsFallMenuUiListener menuUiListener) {
mMenuUiListener = menuUiListener;
}
+ private List<BrowserActionItem> buildFallbackMenuItemList(
+ Context context, List<BrowserActionItem> customItems) {
+ List<BrowserActionItem> fallbackMenuItems = new ArrayList<>();
+ fallbackMenuItems.add(new BrowserActionItem(
+ mContext.getString(R.string.fallback_menu_item_open_in_browser),
+ buildOpenInBrowserAction()));
+ fallbackMenuItems.add(new BrowserActionItem(
+ mContext.getString(R.string.fallback_menu_item_copy_link), buildCopyAction()));
+ fallbackMenuItems.add(new BrowserActionItem(
+ mContext.getString(R.string.fallback_menu_item_share_link), buildShareAction()));
+ fallbackMenuItems.addAll(customItems);
+ return fallbackMenuItems;
+ }
+
+ private PendingIntent buildOpenInBrowserAction() {
+ Intent intent = new Intent(Intent.ACTION_VIEW, mUri);
+ return PendingIntent.getActivity(mContext, 0, intent, 0);
+ }
+
+ private PendingIntent buildShareAction() {
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.putExtra(Intent.EXTRA_TEXT, mUri.toString());
+ intent.setType("text/plain");
+ return PendingIntent.getActivity(mContext, 0, intent, 0);
+ }
+
+ private Runnable buildCopyAction() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ ClipboardManager clipboardManager =
+ (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+ ClipData data = ClipData.newPlainText("url", mUri.toString());
+ clipboardManager.setPrimaryClip(data);
+ String toastMsg = mContext.getString(R.string.copy_toast_msg);
+ Toast.makeText(mContext, toastMsg, Toast.LENGTH_SHORT).show();
+ }
+ };
+ }
+
/**
* Shows the fallback menu.
*/
@@ -128,12 +175,16 @@
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- PendingIntent action = mMenuItems.get(position).getAction();
- try {
- action.send();
- mBrowserActionsDialog.dismiss();
- } catch (CanceledException e) {
- Log.e(TAG, "Failed to send custom item action", e);
+ BrowserActionItem menuItem = mMenuItems.get(position);
+ if (menuItem.getAction() != null) {
+ try {
+ menuItem.getAction().send();
+ } catch (CanceledException e) {
+ Log.e(TAG, "Failed to send custom item action", e);
+ }
+ } else if (menuItem.getRunnableAction() != null) {
+ menuItem.getRunnableAction().run();
}
+ mBrowserActionsDialog.dismiss();
}
}
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java
index 351ee46..b6d67af 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java
@@ -16,7 +16,7 @@
package androidx.browser.browseractions;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -29,7 +29,7 @@
* The class responsible for deciding the size of Browser Actions context menu.
*/
/** @hide */
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class BrowserActionsFallbackMenuView extends LinearLayout {
private final int mBrowserActionsMenuMinPaddingPx;
private final int mBrowserActionsMenuMaxWidthPx;
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
index 00aaafd..42d0729 100644
--- a/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
@@ -16,7 +16,8 @@
package androidx.browser.browseractions;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.PendingIntent;
import android.content.Context;
@@ -31,6 +32,7 @@
import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.ContextCompat;
@@ -40,12 +42,13 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+
/**
* Class holding the {@link Intent} and start bundle for a Browser Actions Activity.
*
* <p>
* <strong>Note:</strong> The constants below are public for the browser implementation's benefit.
- * You are strongly encouraged to use {@link BrowserActionsIntent.Builder}.</p>
+ * You are strongly encouraged to use {@link BrowserActionsIntent.Builder}.
*/
public class BrowserActionsIntent {
private static final String TAG = "BrowserActions";
@@ -55,6 +58,10 @@
/**
* Extra that specifies {@link PendingIntent} indicating which Application sends the {@link
* BrowserActionsIntent}.
+ * <p>
+ * <strong>Note:</strong> The PendingIntent is self-reported and untrusted, sending application
+ * can modify it to use PendingIntent from other apps. This would return the package name from
+ * the app who creates the PendintIntent.
*/
public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
@@ -70,6 +77,12 @@
public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
/**
+ * Extra {@link Uri} that specifies location of file for the icon of a custom item shown in the
+ * Browser Actions menu.
+ */
+ private static final String KEY_ICON_URI = "androidx.browser.browseractions.ICON_URI";
+
+ /**
* Extra string that specifies the title of a custom item shown in the Browser Actions menu.
*/
public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
@@ -107,7 +120,7 @@
* Defines the types of url for Browser Actions menu.
*/
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({URL_TYPE_NONE, URL_TYPE_IMAGE, URL_TYPE_VIDEO, URL_TYPE_AUDIO, URL_TYPE_FILE,
URL_TYPE_PLUGIN})
@Retention(RetentionPolicy.SOURCE)
@@ -124,7 +137,7 @@
* TODO(ltian): A long term solution need, since other providers might have customized menus.
*/
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({ITEM_INVALID_ITEM, ITEM_OPEN_IN_NEW_TAB, ITEM_OPEN_IN_INCOGNITO, ITEM_DOWNLOAD,
ITEM_COPY, ITEM_SHARE})
@Retention(RetentionPolicy.SOURCE)
@@ -156,7 +169,7 @@
/** @hide */
@VisibleForTesting
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
interface BrowserActionsFallDialogListener {
void onDialogShown();
}
@@ -174,6 +187,7 @@
private int mType;
private ArrayList<Bundle> mMenuItems = null;
private PendingIntent mOnItemSelectedPendingIntent = null;
+ private List<Uri> mImageUris = null;
/**
* Constructs a {@link BrowserActionsIntent.Builder} object associated with default setting
@@ -186,6 +200,7 @@
mUri = uri;
mType = URL_TYPE_NONE;
mMenuItems = new ArrayList<>();
+ mImageUris = new ArrayList<>();
}
/**
@@ -215,6 +230,9 @@
"Custom item should contain a non-empty title and non-null intent.");
} else {
mMenuItems.add(getBundleFromItem(items.get(i)));
+ if (items.get(i).getIconUri() != null) {
+ mImageUris.add(items.get(i).getIconUri());
+ }
}
}
return this;
@@ -249,6 +267,7 @@
bundle.putString(KEY_TITLE, item.getTitle());
bundle.putParcelable(KEY_ACTION, item.getAction());
if (item.getIconId() != 0) bundle.putInt(KEY_ICON_ID, item.getIconId());
+ if (item.getIconUri() != null) bundle.putParcelable(KEY_ICON_URI, item.getIconUri());
return bundle;
}
@@ -266,6 +285,7 @@
mIntent.putExtra(
EXTRA_SELECTED_ACTION_PENDING_INTENT, mOnItemSelectedPendingIntent);
}
+ BrowserServiceFileProvider.grantReadPermission(mIntent, mImageUris, mContext);
return new BrowserActionsIntent(mIntent);
}
}
@@ -316,7 +336,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
static void launchIntent(Context context, Intent intent, List<ResolveInfo> handlers) {
if (handlers == null || handlers.size() == 0) {
@@ -347,8 +367,11 @@
* BrowserActionsIntent}.
* @param context The context requesting for a Browser Actions menu.
* @return List of Browser Actions providers available to handle the intent.
+ * @hide
*/
- private static List<ResolveInfo> getBrowserActionsIntentHandlers(Context context) {
+ @RestrictTo(LIBRARY)
+ @NonNull
+ public static List<ResolveInfo> getBrowserActionsIntentHandlers(@NonNull Context context) {
Intent intent =
new Intent(BrowserActionsIntent.ACTION_BROWSER_ACTIONS_OPEN, Uri.parse(TEST_URL));
PackageManager pm = context.getPackageManager();
@@ -364,7 +387,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
static void setDialogShownListenter(BrowserActionsFallDialogListener dialogListener) {
sDialogListenter = dialogListener;
@@ -375,7 +398,7 @@
* @param context The context requesting for a Browser Actions menu.
* @param uri The url for Browser Actions menu.
* @param type The type of the url for context menu to be opened.
- * @param menuItems List of custom items to add to Browser Actions menu.
+ * @param menuItems List of {@link BrowserActionItem} to add to the fallback menu.
*/
private static void openFallbackBrowserActionsMenu(
Context context, Uri uri, int type, List<BrowserActionItem> menuItems) {
@@ -396,16 +419,22 @@
List<BrowserActionItem> mActions = new ArrayList<>();
for (int i = 0; i < bundles.size(); i++) {
Bundle bundle = bundles.get(i);
- String title = bundle.getString(BrowserActionsIntent.KEY_TITLE);
- PendingIntent action = bundle.getParcelable(BrowserActionsIntent.KEY_ACTION);
+ String title = bundle.getString(KEY_TITLE);
+ PendingIntent action = bundle.getParcelable(KEY_ACTION);
@DrawableRes
- int iconId = bundle.getInt(BrowserActionsIntent.KEY_ICON_ID);
- if (TextUtils.isEmpty(title) || action == null) {
+ int iconId = bundle.getInt(KEY_ICON_ID);
+ Uri iconUri = bundle.getParcelable(KEY_ICON_URI);
+ if (!TextUtils.isEmpty(title) && action != null) {
+ BrowserActionItem item;
+ if (iconId != 0) {
+ item = new BrowserActionItem(title, action, iconId);
+ } else {
+ item = new BrowserActionItem(title, action, iconUri);
+ }
+ mActions.add(item);
+ } else {
throw new IllegalArgumentException(
"Custom item should contain a non-empty title and non-null intent.");
- } else {
- BrowserActionItem item = new BrowserActionItem(title, action, iconId);
- mActions.add(item);
}
}
return mActions;
@@ -413,11 +442,16 @@
/**
* Get the package name of the creator application.
+ * <p>
+ * <strong> Note:</strong> This is self-reported and could be untrusted. Intent sender can
+ * modify it to return the package name from a different application.
+ *
* @param intent The {@link BrowserActionsIntent}.
* @return The creator package name.
*/
@SuppressWarnings("deprecation")
- public static String getCreatorPackageName(Intent intent) {
+ @Nullable
+ public static String getUntrustedCreatorPackageName(@NonNull Intent intent) {
PendingIntent pendingIntent = intent.getParcelableExtra(BrowserActionsIntent.EXTRA_APP_ID);
if (pendingIntent != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
@@ -428,4 +462,15 @@
}
return null;
}
+
+ /**
+ * @deprecated This return value of this method cannot be trusted, it is kept around for
+ * compatibility. Use {@link #getUntrustedCreatorPackageName}, or an alternative
+ * method if you rely on the return value.
+ */
+ @Deprecated
+ @Nullable
+ public static String getCreatorPackageName(@NonNull Intent intent) {
+ return getUntrustedCreatorPackageName(intent);
+ }
}
diff --git a/browser/src/main/java/androidx/browser/browseractions/BrowserServiceFileProvider.java b/browser/src/main/java/androidx/browser/browseractions/BrowserServiceFileProvider.java
new file mode 100644
index 0000000..0d53d78
--- /dev/null
+++ b/browser/src/main/java/androidx/browser/browseractions/BrowserServiceFileProvider.java
@@ -0,0 +1,301 @@
+/*
+ * 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.browser.browseractions;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.content.ClipData;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.UiThread;
+import androidx.concurrent.futures.ResolvableFuture;
+import androidx.core.content.FileProvider;
+import androidx.core.util.AtomicFile;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * The class to pass images asynchronously between different Browser Services provider and Browser
+ * client.
+ *
+ * Call {@link #saveBitmap} to save the image and {@link #loadBitmap} to read it.
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public final class BrowserServiceFileProvider extends FileProvider {
+ private static final String TAG = "BrowserServiceFP";
+ private static final String AUTHORITY_SUFFIX = ".image_provider";
+ private static final String CONTENT_SCHEME = "content";
+ private static final String FILE_SUB_DIR = "image_provider";
+ private static final String FILE_SUB_DIR_NAME = "image_provider_images/";
+ private static final String FILE_EXTENSION = ".png";
+ private static final String CLIP_DATA_LABEL = "image_provider_uris";
+ private static final String LAST_CLEANUP_TIME_KEY = "last_cleanup_time";
+
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ static Object sFileCleanupLock = new Object();
+
+ private static class FileCleanupTask extends AsyncTask<Void, Void, Void> {
+ private final Context mAppContext;
+ private static final long IMAGE_RETENTION_DURATION = TimeUnit.DAYS.toMillis(7);
+ private static final long CLEANUP_REQUIRED_TIME_SPAN = TimeUnit.DAYS.toMillis(7);
+ private static final long DELETION_FAILED_REATTEMPT_DURATION = TimeUnit.DAYS.toMillis(1);
+
+ FileCleanupTask(Context context) {
+ super();
+ mAppContext = context.getApplicationContext();
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ SharedPreferences prefs = mAppContext.getSharedPreferences(
+ mAppContext.getPackageName() + AUTHORITY_SUFFIX, Context.MODE_PRIVATE);
+ if (!shouldCleanUp(prefs)) return null;
+ synchronized (sFileCleanupLock) {
+ boolean allFilesDeletedSuccessfully = true;
+ File path = new File(mAppContext.getFilesDir(), FILE_SUB_DIR);
+ if (!path.exists()) return null;
+ File[] files = path.listFiles();
+ long retentionDate = System.currentTimeMillis() - IMAGE_RETENTION_DURATION;
+ for (File file : files) {
+ if (!isImageFile(file)) continue;
+ long lastModified = file.lastModified();
+ if (lastModified < retentionDate && !file.delete()) {
+ Log.e(TAG, "Fail to delete image: " + file.getAbsoluteFile());
+ allFilesDeletedSuccessfully = false;
+ }
+ }
+ // If fail to delete some files, kill off clean up task after one day.
+ long lastCleanUpTime;
+ if (allFilesDeletedSuccessfully) {
+ lastCleanUpTime = System.currentTimeMillis();
+ } else {
+ lastCleanUpTime = System.currentTimeMillis() - CLEANUP_REQUIRED_TIME_SPAN
+ + DELETION_FAILED_REATTEMPT_DURATION;
+ }
+ Editor editor = prefs.edit();
+ editor.putLong(LAST_CLEANUP_TIME_KEY, lastCleanUpTime);
+ editor.apply();
+ }
+ return null;
+ }
+
+ private static boolean isImageFile(File file) {
+ String filename = file.getName();
+ return filename.endsWith("." + FILE_EXTENSION);
+ }
+
+ private static boolean shouldCleanUp(SharedPreferences prefs) {
+ long lastCleanup = prefs.getLong(LAST_CLEANUP_TIME_KEY, System.currentTimeMillis());
+ return System.currentTimeMillis() > lastCleanup + CLEANUP_REQUIRED_TIME_SPAN;
+ }
+ }
+
+ private static class FileSaveTask extends AsyncTask<String, Void, Void> {
+ private final Context mAppContext;
+ private final String mFilename;
+ private final Bitmap mBitmap;
+ private final Uri mFileUri;
+ private final ResolvableFuture<Uri> mResultFuture;
+
+ FileSaveTask(Context context, String filename, Bitmap bitmap, Uri fileUri,
+ ResolvableFuture<Uri> resultFuture) {
+ super();
+ mAppContext = context.getApplicationContext();
+ mFilename = filename;
+ mBitmap = bitmap;
+ mFileUri = fileUri;
+ mResultFuture = resultFuture;
+ }
+
+ @Override
+ protected Void doInBackground(String... params) {
+ saveFileIfNeededBlocking();
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ new FileCleanupTask(mAppContext).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
+ }
+
+ private void saveFileIfNeededBlocking() {
+ File path = new File(mAppContext.getFilesDir(), FILE_SUB_DIR);
+ synchronized (sFileCleanupLock) {
+ if (!path.exists() && !path.mkdir()) {
+ mResultFuture.setException(new IOException("Could not create file directory."));
+ return;
+ }
+ File img = new File(path, mFilename + FILE_EXTENSION);
+
+ if (img.exists()) {
+ mResultFuture.set(mFileUri);
+ } else {
+ saveFileBlocking(img);
+ }
+
+ img.setLastModified(System.currentTimeMillis());
+ }
+ }
+
+ private void saveFileBlocking(File img) {
+ FileOutputStream fOut = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
+ AtomicFile atomicFile = new AtomicFile(img);
+ try {
+ fOut = atomicFile.startWrite();
+ mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
+ fOut.close();
+ atomicFile.finishWrite(fOut);
+
+ mResultFuture.set(mFileUri);
+ } catch (IOException e) {
+ atomicFile.failWrite(fOut);
+
+ mResultFuture.setException(e);
+ }
+ } else {
+ try {
+ fOut = new FileOutputStream(img);
+ mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
+ fOut.close();
+
+ mResultFuture.set(mFileUri);
+ } catch (IOException e) {
+ mResultFuture.setException(e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Request a {@link Uri} used to access the bitmap through the file provider.
+ * @param context The {@link Context} used to generate the uri, save the bitmap and grant the
+ * read permission.
+ * @param bitmap The {@link Bitmap} to be saved and access through the file provider.
+ * @param name The name of the bitmap.
+ * @param version The version number of the bitmap. Note: This plus the name decides the
+ * filename of the bitmap. If it matches with existing file, bitmap will skip
+ * saving.
+ * @return A {@link ResolvableFuture} that will be fulfilled with the uri of the bitmap once
+ * file writing has completed or an IOException describing the reason for failure.
+ */
+ @UiThread
+ @NonNull
+ public static ResolvableFuture<Uri> saveBitmap(@NonNull Context context, @NonNull Bitmap bitmap,
+ @NonNull String name, int version) {
+ String filename = name + "_" + Integer.toString(version);
+ Uri uri = generateUri(context, filename);
+
+ ResolvableFuture<Uri> result = ResolvableFuture.create();
+ new FileSaveTask(context, filename, bitmap, uri, result)
+ .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ return result;
+ }
+
+ private static Uri generateUri(Context context, String filename) {
+ String fileName = FILE_SUB_DIR_NAME + filename + FILE_EXTENSION;
+ return new Uri.Builder()
+ .scheme(CONTENT_SCHEME)
+ .authority(context.getPackageName() + AUTHORITY_SUFFIX)
+ .path(fileName)
+ .build();
+ }
+
+ /**
+ * Grant the read permission to a list of {@link Uri} sent through a {@link Intent}.
+ * @param intent The sending Intent which holds a list of Uri.
+ * @param uris A list of Uri generated by saveBitmap(Context, Bitmap, String, int,
+ * List<String>), if null, nothing will be done.
+ * @param context The context requests to grant the permission.
+ */
+ public static void grantReadPermission(@NonNull Intent intent, @Nullable List<Uri> uris,
+ @NonNull Context context) {
+ if (uris == null || uris.size() == 0) return;
+ ContentResolver resolver = context.getContentResolver();
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ ClipData clipData = ClipData.newUri(resolver, CLIP_DATA_LABEL, uris.get(0));
+ for (int i = 1; i < uris.size(); i++) {
+ clipData.addItem(new ClipData.Item(uris.get(i)));
+ }
+ intent.setClipData(clipData);
+ }
+
+ /**
+ * Asynchronously loads a {@link Bitmap} from the uri generated by {@link #saveBitmap}.
+ * @param resolver {@link ContentResolver} to access the Bitmap.
+ * @param uri {@link Uri} pointing to the Bitmap.
+ * @return A {@link ListenableFuture} that will be fulfilled with the Bitmap once the load has
+ * completed or with an IOException describing the reason for failure.
+ */
+ @NonNull
+ public static ListenableFuture<Bitmap> loadBitmap(@NonNull final ContentResolver resolver,
+ @NonNull final Uri uri) {
+ final ResolvableFuture<Bitmap> result = ResolvableFuture.create();
+
+ AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ ParcelFileDescriptor descriptor = resolver.openFileDescriptor(uri, "r");
+
+ if (descriptor == null) {
+ result.setException(new FileNotFoundException());
+ return;
+ }
+
+ FileDescriptor fileDescriptor = descriptor.getFileDescriptor();
+ Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
+ descriptor.close();
+
+ if (bitmap == null) {
+ result.setException(new IOException("File could not be decoded."));
+ return;
+ }
+
+ result.set(bitmap);
+ } catch (IOException e) {
+ result.setException(e);
+ }
+ }
+ });
+
+ return result;
+ }
+}
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java
index 2739bb0..2daff4e 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java
@@ -19,6 +19,8 @@
import android.net.Uri;
import android.os.Bundle;
+import androidx.browser.customtabs.CustomTabsService.Relation;
+
/**
* A callback class for custom tabs client to get messages regarding events in their custom tabs. In
* the implementation, all callbacks are sent to the UI thread for the client.
@@ -75,7 +77,7 @@
* purposes.
*
* @param callbackName Name of the extra callback.
- * @param args Arguments for the calback
+ * @param args Arguments for the callback
*/
public void extraCallback(String callbackName, Bundle args) {}
@@ -111,6 +113,6 @@
* @param result Whether the relation was validated.
* @param extras Reserved for future use.
*/
- public void onRelationshipValidationResult(@CustomTabsService.Relation int relation, Uri requestedOrigin,
- boolean result, Bundle extras) {}
+ public void onRelationshipValidationResult(@Relation int relation, Uri requestedOrigin,
+ boolean result, Bundle extras) {}
}
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
index 42dee4a..7cb492f 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
@@ -16,7 +16,7 @@
package androidx.browser.customtabs;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.content.Context;
@@ -33,8 +33,10 @@
import android.support.customtabs.ICustomTabsService;
import android.text.TextUtils;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
+import androidx.browser.customtabs.CustomTabsService.Relation;
import java.util.ArrayList;
import java.util.List;
@@ -48,7 +50,7 @@
private final ComponentName mServiceComponentName;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
CustomTabsClient(ICustomTabsService service, ComponentName componentName) {
mService = service;
mServiceComponentName = componentName;
@@ -77,7 +79,7 @@
/**
* Returns the preferred package to use for Custom Tabs, preferring the default VIEW handler.
*
- * @see #getPackageName(Context, List, boolean)
+ * @see #getPackageName(Context, List<String>, boolean)
*/
public static String getPackageName(Context context, @Nullable List<String> packages) {
return getPackageName(context, packages, false);
@@ -96,8 +98,8 @@
* @param ignoreDefault If set, the default VIEW handler won't get priority over other browsers.
* @return The preferred package name for handling Custom Tabs, or <code>null</code>.
*/
- public static String getPackageName(
- Context context, @Nullable List<String> packages, boolean ignoreDefault) {
+ public static @Nullable String getPackageName(
+ @NonNull Context context, @Nullable List<String> packages, boolean ignoreDefault) {
PackageManager pm = context.getPackageManager();
List<String> packageNames = packages == null ? new ArrayList<String>() : packages;
@@ -149,8 +151,8 @@
applicationContext.unbindService(this);
}
- @Override
- public final void onServiceDisconnected(ComponentName componentName) { }
+ @Override
+ public void onServiceDisconnected(ComponentName componentName) { }
};
try {
return bindCustomTabsService(applicationContext, packageName, connection);
@@ -240,7 +242,7 @@
@Override
public void onRelationshipValidationResult(
- final @CustomTabsService.Relation int relation, final Uri requestedOrigin, final boolean result,
+ final @Relation int relation, final Uri requestedOrigin, final boolean result,
final @Nullable Bundle extras) throws RemoteException {
if (callback == null) return;
mHandler.post(new Runnable() {
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
index f07aa8e..80cc6bb 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
@@ -130,7 +130,7 @@
@Override
public boolean mayLaunchUrl(ICustomTabsCallback callback, Uri url,
- Bundle extras, List<Bundle> otherLikelyBundles) {
+ Bundle extras, List<Bundle> otherLikelyBundles) {
return CustomTabsService.this.mayLaunchUrl(
new CustomTabsSessionToken(callback), url, extras, otherLikelyBundles);
}
@@ -148,7 +148,7 @@
@Override
public boolean requestPostMessageChannel(ICustomTabsCallback callback,
- Uri postMessageOrigin) {
+ Uri postMessageOrigin) {
return CustomTabsService.this.requestPostMessageChannel(
new CustomTabsSessionToken(callback), postMessageOrigin);
}
@@ -236,7 +236,7 @@
* @return Whether the call was successful.
*/
protected abstract boolean mayLaunchUrl(CustomTabsSessionToken sessionToken, Uri url,
- Bundle extras, List<Bundle> otherLikelyBundles);
+ Bundle extras, List<Bundle> otherLikelyBundles);
/**
* Unsupported commands that may be provided by the implementation.
@@ -264,7 +264,7 @@
* @return Whether the operation was successful.
*/
protected abstract boolean updateVisuals(CustomTabsSessionToken sessionToken,
- Bundle bundle);
+ Bundle bundle);
/**
* Sends a request to create a two way postMessage channel between the client and the browser
@@ -278,7 +278,7 @@
* asynchronous.
*/
protected abstract boolean requestPostMessageChannel(CustomTabsSessionToken sessionToken,
- Uri postMessageOrigin);
+ Uri postMessageOrigin);
/**
* Sends a postMessage request using the origin communicated via
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
index 3122495..99540f5 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
@@ -31,6 +31,8 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import androidx.browser.customtabs.CustomTabsService.Relation;
+import androidx.browser.customtabs.CustomTabsService.Result;
import java.util.List;
@@ -190,9 +192,9 @@
* @param message The message that is being sent.
* @param extras Reserved for future use.
* @return An integer constant about the postMessage request result. Will return
- * {@link CustomTabsService#RESULT_SUCCESS} if successful.
+ * {@link CustomTabsService#RESULT_SUCCESS} if successful.
*/
- @CustomTabsService.Result
+ @Result
public int postMessage(String message, Bundle extras) {
synchronized (mLock) {
try {
@@ -223,8 +225,8 @@
* @param extras Reserved for future use.
* @return {@code true} if the request has been submitted successfully.
*/
- public boolean validateRelationship(@CustomTabsService.Relation int relation, @NonNull Uri origin,
- @Nullable Bundle extras) {
+ public boolean validateRelationship(@Relation int relation, @NonNull Uri origin,
+ @Nullable Bundle extras) {
if (relation < CustomTabsService.RELATION_USE_AS_ORIGIN
|| relation > CustomTabsService.RELATION_HANDLE_ALL_URLS) {
return false;
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java
index 0783a22..b666adf 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java
@@ -25,6 +25,7 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.browser.customtabs.CustomTabsService.Relation;
import androidx.core.app.BundleCompat;
/**
@@ -52,7 +53,7 @@
public void onPostMessage(String message, Bundle extras) {}
@Override
- public void onRelationshipValidationResult(@CustomTabsService.Relation int relation, Uri requestedOrigin,
+ public void onRelationshipValidationResult(@Relation int relation, Uri requestedOrigin,
boolean result, Bundle extras) {}
@Override
@@ -127,8 +128,8 @@
}
@Override
- public void onRelationshipValidationResult(@CustomTabsService.Relation int relation, Uri origin,
- boolean result, Bundle extras) {
+ public void onRelationshipValidationResult(@Relation int relation, Uri origin,
+ boolean result, Bundle extras) {
try {
mCallbackBinder.onRelationshipValidationResult(
relation, origin, result, extras);
diff --git a/browser/src/main/java/androidx/browser/customtabs/PostMessageService.java b/browser/src/main/java/androidx/browser/customtabs/PostMessageService.java
index 3764d65..ec8e1d4 100644
--- a/browser/src/main/java/androidx/browser/customtabs/PostMessageService.java
+++ b/browser/src/main/java/androidx/browser/customtabs/PostMessageService.java
@@ -38,7 +38,7 @@
@Override
public void onPostMessage(ICustomTabsCallback callback,
- String message, Bundle extras) throws RemoteException {
+ String message, Bundle extras) throws RemoteException {
callback.onPostMessage(message, extras);
}
};
diff --git a/browser/src/main/res/layout/browser_actions_context_menu_page.xml b/browser/src/main/res/layout/browser_actions_context_menu_page.xml
index 7720f91..696f2ff 100644
--- a/browser/src/main/res/layout/browser_actions_context_menu_page.xml
+++ b/browser/src/main/res/layout/browser_actions_context_menu_page.xml
@@ -1,7 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
+<!-- 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
+-->
+
<androidx.browser.browseractions.BrowserActionsFallbackMenuView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
diff --git a/browser/src/main/res/layout/browser_actions_context_menu_row.xml b/browser/src/main/res/layout/browser_actions_context_menu_row.xml
index d13e48f..91ccd11 100644
--- a/browser/src/main/res/layout/browser_actions_context_menu_row.xml
+++ b/browser/src/main/res/layout/browser_actions_context_menu_row.xml
@@ -1,7 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
+<!-- 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
+-->
+
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
@@ -9,15 +21,7 @@
android:layout_height="wrap_content"
android:paddingStart="15dp"
android:paddingEnd="15dp"
- android:minHeight="40dp">
- <ImageView
- android:id="@+id/browser_actions_menu_item_icon"
- android:layout_width="20dp"
- android:layout_height="match_parent"
- android:paddingTop="10dp"
- android:paddingBottom="10dp"
- android:scaleType="centerInside"
- android:contentDescription="@null" />
+ android:minHeight="48dp">
<TextView
android:id="@+id/browser_actions_menu_item_text"
android:layout_width="0dp"
@@ -27,4 +31,12 @@
android:layout_weight="1"
android:textSize="15sp"
android:textColor="@color/browser_actions_text_color" />
+ <ImageView
+ android:id="@+id/browser_actions_menu_item_icon"
+ android:layout_width="20dp"
+ android:layout_height="match_parent"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:scaleType="centerInside"
+ android:contentDescription="@null" />
</LinearLayout>
diff --git a/browser/src/main/res/values/colors.xml b/browser/src/main/res/values/colors.xml
index 3086991..f21807f 100644
--- a/browser/src/main/res/values/colors.xml
+++ b/browser/src/main/res/values/colors.xml
@@ -1,7 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
+<!-- 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
+-->
<resources>
<color name="browser_actions_text_color">#DE000000</color>
diff --git a/browser/src/main/res/values/dimens.xml b/browser/src/main/res/values/dimens.xml
index b90750a..463fa1f 100644
--- a/browser/src/main/res/values/dimens.xml
+++ b/browser/src/main/res/values/dimens.xml
@@ -1,7 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Chromium Authors. All rights reserved.
- Use of this source code is governed by a BSD-style license that can be
- found in the LICENSE file. -->
+<!-- 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
+-->
<resources>
<!-- Browser Actions Context Menu Dimensions -->
diff --git a/browser/src/main/res/values/strings.xml b/browser/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b4c9924
--- /dev/null
+++ b/browser/src/main/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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
+-->
+
+<resources>
+ <string name="fallback_menu_item_open_in_browser">Open in browser</string>
+ <string name="fallback_menu_item_copy_link">Copy link</string>
+ <string name="fallback_menu_item_share_link">Share link</string>
+ <string name="copy_toast_msg">Link copied to clipboard</string>
+</resources>
\ No newline at end of file
diff --git a/savedstate/bundle/src/main/AndroidManifest.xml b/browser/src/main/res/xml/image_share_filepaths.xml
similarity index 76%
copy from savedstate/bundle/src/main/AndroidManifest.xml
copy to browser/src/main/res/xml/image_share_filepaths.xml
index f52ae56..123fde9 100644
--- a/savedstate/bundle/src/main/AndroidManifest.xml
+++ b/browser/src/main/res/xml/image_share_filepaths.xml
@@ -5,13 +5,15 @@
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
- limitations under the License.
+ limitations under the License
-->
-<manifest package="androidx.savedstate.bundle">
-</manifest>
+
+<paths>
+ <files-path path="image_provider/" name="image_provider_images" />
+</paths>
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index f00abbc..36c5f72 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-
import androidx.build.BuildServerConfigurationKt
import androidx.build.dependencyTracker.AffectedModuleDetector
import androidx.build.gmaven.GMavenVersionChecker
@@ -93,7 +92,7 @@
// Copy instrumentation test APKs and app APKs into the dist dir
// For test apks, they are uploaded only if we have java test sources.
// For regular app apks, they are uploaded only if they have java sources.
- project.tasks.whenTaskAdded { task ->
+ project.tasks.configureEach { task ->
if (task.name.startsWith("packageDebug")) {
// run this task only if we should run it
def testApk = task.name.contains("AndroidTest")
@@ -142,22 +141,21 @@
}
// copy host side test results to DIST
- project.tasks.whenTaskAdded { task ->
- if (task instanceof org.gradle.api.tasks.testing.Test) {
- def junitReport = task.reports.junitXml
- if (junitReport.enabled) {
- def zipTask = project.tasks.create(name : "zipResultsOf${task.name.capitalize()}", type : Zip) {
- destinationDir(BuildServerConfigurationKt.getHostTestResultDirectory(project))
- // first one is always :, drop it.
- archiveName("${project.getPath().split(":").join("_").substring(1)}.zip")
- }
- if (BuildServerConfigurationKt.isRunningOnBuildServer()) {
- task.ignoreFailures = true
- }
- task.finalizedBy zipTask
- task.doFirst {
- zipTask.from(junitReport.destination)
- }
+ project.tasks.withType(Test) { task ->
+ def junitReport = task.reports.junitXml
+ if (junitReport.enabled) {
+ def zipTask = project.tasks.create(
+ name: "zipResultsOf${task.name.capitalize()}", type: Zip) {
+ destinationDir(BuildServerConfigurationKt.getHostTestResultDirectory(project))
+ // first one is always :, drop it.
+ archiveName("${project.getPath().split(":").join("_").substring(1)}.zip")
+ }
+ if (BuildServerConfigurationKt.isRunningOnBuildServer()) {
+ task.ignoreFailures = true
+ }
+ task.finalizedBy zipTask
+ task.doFirst {
+ zipTask.from(junitReport.destination)
}
}
}
diff --git a/buildSrc/jetify.gradle b/buildSrc/jetify.gradle
index 2d161d5..b647dbf 100644
--- a/buildSrc/jetify.gradle
+++ b/buildSrc/jetify.gradle
@@ -19,7 +19,7 @@
def standaloneProject = project(":jetifier-standalone")
def jetifierBin = file("${standaloneProject.buildDir}/install/jetifier-standalone/bin/jetifier-standalone")
-def commonArchivesToDejetify = [
+def archivesToDejetify = [
"m2repository/androidx/activity/**",
"m2repository/androidx/annotation/**",
"m2repository/androidx/appcompat/**",
@@ -68,54 +68,21 @@
"m2repository/androidx/vectordrawable/**",
"m2repository/androidx/versionedparcelable/**",
"m2repository/androidx/viewpager/**",
- "m2repository/androidx/wear/**"
-]
-
-def extraArchivesForPartialDejetification = [
+ "m2repository/androidx/wear/**",
"m2repository/androidx/media2/**",
"m2repository/androidx/concurrent/**",
"m2repository/androidx/sharetarget/**"
]
-task stripReleasedArchive(type: Zip) {
- dependsOn tasks[Release.FULL_ARCHIVE_TASK_NAME]
- from zipTree(project.tasks['createArchive'].archivePath)
- destinationDir rootProject.buildDir
- archiveName "stripped_archive.zip"
- include commonArchivesToDejetify
-
-}
-
task stripArchiveForPartialDejetification(type: Zip) {
dependsOn tasks[Release.FULL_ARCHIVE_TASK_NAME]
from zipTree(project.tasks['createArchive'].archivePath)
destinationDir rootProject.buildDir
archiveName "stripped_archive_partial.zip"
- include commonArchivesToDejetify + extraArchivesForPartialDejetification
+ include archivesToDejetify
}
-task dejetifyArchive(type: Exec) {
- description "Produces a zip of dejetified artifacts by running Dejetifier against refactored" +
- " artifacts, for temporary usage by external clients that haven't upgraded to Jetpack" +
- " yet."
-
- dependsOn ':jetifier-standalone:installDist'
- dependsOn project.tasks['stripReleasedArchive']
- inputs.file project.tasks['stripReleasedArchive'].archivePath
-
- outputs.file "${BuildServerConfigurationKt.getDistributionDirectory(rootProject).absolutePath}/top-of-tree-m2repository-dejetified-${BuildServerConfigurationKt.getBuildId()}.zip"
-
- commandLine (
- "${jetifierBin}",
- "-i", "${inputs.files.singleFile}",
- "-o", "${outputs.files.singleFile}",
- "--log", "warning",
- "--reversed",
- "--rebuildTopOfTree"
- )
-}
-
task partiallyDejetifyArchive(type: Exec) {
description "Produces a zip of partially dejetified artifacts by running Dejetifier against refactored" +
" artifacts, for temporary migration purposes."
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index aa6c111..9f4db33 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -36,6 +36,7 @@
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.LibraryPlugin
+import com.android.build.gradle.internal.tasks.factory.dependsOn
import org.gradle.api.DefaultTask
import org.gradle.api.Task
import org.gradle.api.JavaVersion.VERSION_1_7
@@ -46,10 +47,9 @@
import org.gradle.api.plugins.JavaLibraryPlugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginConvention
+import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Jar
-import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.kotlin.dsl.extra
-import org.gradle.kotlin.dsl.get
import org.gradle.kotlin.dsl.getPlugin
import org.gradle.kotlin.dsl.withType
import java.util.concurrent.ConcurrentHashMap
@@ -85,8 +85,9 @@
targetCompatibility = VERSION_1_7
}
val verifyDependencyVersionsTask = project.createVerifyDependencyVersionsTask()
- val compileJavaTask = project.properties["compileJava"] as JavaCompile
- verifyDependencyVersionsTask.dependsOn(compileJavaTask)
+ verifyDependencyVersionsTask.configure {
+ it.dependsOn(project.tasks.named(JavaPlugin.COMPILE_JAVA_TASK_NAME))
+ }
project.createCheckReleaseReadyTask(listOf(verifyDependencyVersionsTask))
}
is LibraryPlugin -> {
@@ -97,17 +98,19 @@
project.configureVersionFileWriter(extension)
project.configureResourceApiChecks()
val verifyDependencyVersionsTask = project.createVerifyDependencyVersionsTask()
- val checkNoWarningsTask = project.tasks.create(CHECK_NO_WARNINGS_TASK)
+ val checkNoWarningsTask = project.tasks.register(CHECK_NO_WARNINGS_TASK)
project.createCheckReleaseReadyTask(listOf(verifyDependencyVersionsTask,
checkNoWarningsTask))
extension.libraryVariants.all { libraryVariant ->
- val javaCompileTask = libraryVariant
- .javaCompileProvider.get()
- verifyDependencyVersionsTask.dependsOn(javaCompileTask)
- checkNoWarningsTask.dependsOn(javaCompileTask)
- project.gradle.taskGraph.whenReady {
- if (it.hasTask(checkNoWarningsTask)) {
- javaCompileTask.options.compilerArgs.add("-Werror")
+ verifyDependencyVersionsTask.configure { task ->
+ task.dependsOn(libraryVariant.javaCompileProvider)
+ }
+ checkNoWarningsTask.dependsOn(libraryVariant.javaCompileProvider)
+ project.gradle.taskGraph.whenReady { executionGraph ->
+ if (executionGraph.hasTask(checkNoWarningsTask.get())) {
+ libraryVariant.javaCompileProvider.configure { task ->
+ task.options.compilerArgs.add("-Werror")
+ }
}
}
}
@@ -146,7 +149,6 @@
"distDocs" == task.name ||
Dokka.ARCHIVE_TASK_NAME == task.name ||
"partiallyDejetifyArchive" == task.name ||
- "dejetifyArchive" == task.name ||
CheckExternalDependencyLicensesTask.TASK_NAME == task.name) {
buildOnServerTask.dependsOn(task)
}
@@ -248,8 +250,11 @@
extension.signingConfigs.getByName("debug").storeFile = SupportConfig.getKeystore(this)
// Disable generating BuildConfig.java
+ // TODO remove after https://issuetracker.google.com/72050365
extension.variants.all {
- it.generateBuildConfigProvider.get().enabled = false
+ it.generateBuildConfigProvider.configure {
+ it.enabled = false
+ }
}
configureErrorProneForAndroid(extension.variants)
@@ -307,8 +312,9 @@
}
}
- private fun Project.createVerifyDependencyVersionsTask(): DefaultTask {
- return project.tasks.create("verifyDependencyVersions",
+ private fun Project.createVerifyDependencyVersionsTask():
+ TaskProvider<VerifyDependencyVersionsTask> {
+ return project.tasks.register("verifyDependencyVersions",
VerifyDependencyVersionsTask::class.java)
}
@@ -349,10 +355,11 @@
}
}
-private fun Project.createCheckReleaseReadyTask(taskList: List<Task>) {
- val checkReleaseReadyTask = project.tasks.create(AndroidXPlugin.CHECK_RELEASE_READY_TASK)
- for (task in taskList) {
- checkReleaseReadyTask.dependsOn(task)
+private fun Project.createCheckReleaseReadyTask(taskProviderList: List<TaskProvider<out Task>>) {
+ project.tasks.register(AndroidXPlugin.CHECK_RELEASE_READY_TASK) {
+ for (taskProvider in taskProviderList) {
+ it.dependsOn(taskProvider)
+ }
}
}
@@ -389,4 +396,4 @@
private fun Project.getGenerateResourceApiFile(): File {
return File(project.buildDir, "intermediates/public_res/release" +
"/packageReleaseResources/public.txt")
-}
\ No newline at end of file
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
index d2d9b13..037d29f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
@@ -42,6 +42,7 @@
import org.gradle.api.file.FileTree
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Zip
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.javadoc.Javadoc
@@ -68,14 +69,14 @@
dacOptions: DacOptions,
additionalRules: List<PublishDocsRules> = emptyList()
) {
- private val anchorTask: Task
+ private val anchorTask: TaskProvider<Task>
private var docsProject: Project? = null
private val rules: List<PublishDocsRules>
- private val docsTasks: MutableMap<String, GenerateDocsTask> = mutableMapOf()
- private val aggregateOldApiTxtsTask: ConcatenateFilesTask
- private val aggregateNewApiTxtsTask: ConcatenateFilesTask
- private val generateDiffsTask: JDiffTask
+ private val docsTasks: MutableMap<String, TaskProvider<GenerateDocsTask>> = mutableMapOf()
+ private val aggregateOldApiTxtsTask: TaskProvider<ConcatenateFilesTask>
+ private val aggregateNewApiTxtsTask: TaskProvider<ConcatenateFilesTask>
+ private val generateDiffsTask: TaskProvider<JDiffTask>
init {
val doclavaConfiguration = root.configurations.create("doclava")
@@ -88,7 +89,7 @@
rules = additionalRules + TIP_OF_TREE
docsProject = root.findProject(":docs-fake")
- anchorTask = root.tasks.create("anchorDocsTask")
+ anchorTask = root.tasks.register("anchorDocsTask")
val generateSdkApiTask = createGenerateSdkApiTask(root, doclavaConfiguration)
val now = LocalDateTime.now()
// The diff output assumes that each library is of the same version,
@@ -112,7 +113,10 @@
taskName = "${it.name}DocsTask",
offline = offline)
docsTasks[it.name] = task
- anchorTask.dependsOn(createDistDocsTask(root, task, it.name))
+ val createDistDocsTask = createDistDocsTask(root, task, it.name)
+ anchorTask.configure {
+ it.dependsOn(createDistDocsTask)
+ }
}
root.tasks.create("generateDocs") { task ->
@@ -123,33 +127,35 @@
val docletClasspath = doclavaConfiguration.resolve()
- aggregateOldApiTxtsTask = root.tasks.create("aggregateOldApiTxts",
- ConcatenateFilesTask::class.java)
- aggregateOldApiTxtsTask.Output = File(root.docsDir(), "previous.txt")
-
- val oldApisTask = root.tasks.createWithConfig("oldApisXml",
- ApiXmlConversionTask::class.java) {
- classpath = root.files(docletClasspath)
- dependsOn(doclavaConfiguration)
-
- inputApiFile = aggregateOldApiTxtsTask.Output
- dependsOn(aggregateOldApiTxtsTask)
-
- outputApiXmlFile = File(root.docsDir(), "previous.xml")
+ aggregateOldApiTxtsTask = root.tasks.register("aggregateOldApiTxts",
+ ConcatenateFilesTask::class.java) {
+ it.Output = File(root.docsDir(), "previous.txt")
}
- aggregateNewApiTxtsTask = root.tasks.create("aggregateNewApiTxts",
- ConcatenateFilesTask::class.java)
- aggregateNewApiTxtsTask.Output = File(root.docsDir(), newVersion)
-
- val newApisTask = root.tasks.createWithConfig("newApisXml",
+ val oldApisTask = root.tasks.register("oldApisXml",
ApiXmlConversionTask::class.java) {
- classpath = root.files(docletClasspath)
+ it.classpath = root.files(docletClasspath)
+ it.dependsOn(doclavaConfiguration)
- inputApiFile = aggregateNewApiTxtsTask.Output
- dependsOn(aggregateNewApiTxtsTask)
+ it.inputApiFile = aggregateOldApiTxtsTask.get().Output
+ it.dependsOn(aggregateOldApiTxtsTask)
- outputApiXmlFile = File(root.docsDir(), "$newVersion.xml")
+ it.outputApiXmlFile = File(root.docsDir(), "previous.xml")
+ }
+
+ aggregateNewApiTxtsTask = root.tasks.register("aggregateNewApiTxts",
+ ConcatenateFilesTask::class.java) {
+ it.Output = File(root.docsDir(), newVersion)
+ }
+
+ val newApisTask = root.tasks.register("newApisXml",
+ ApiXmlConversionTask::class.java) {
+ it.classpath = root.files(docletClasspath)
+
+ it.inputApiFile = aggregateNewApiTxtsTask.get().Output
+ it.dependsOn(aggregateNewApiTxtsTask)
+
+ it.outputApiXmlFile = File(root.docsDir(), "$newVersion.xml")
}
val jdiffConfiguration = root.configurations.create("jdiff")
@@ -162,7 +168,11 @@
newApisTask,
jdiffConfiguration)
- docsTasks.values.forEach { docs -> generateDiffsTask.dependsOn(docs) }
+ generateDiffsTask.configure { diffTask ->
+ docsTasks.values.forEach { docs ->
+ diffTask.dependsOn(docs)
+ }
+ }
}
companion object {
@@ -184,7 +194,7 @@
supportRootFolder: File,
dacOptions: DacOptions,
additionalRules: List<PublishDocsRules> = emptyList()
- ): Task {
+ ): TaskProvider<Task> {
Preconditions.checkArgument(root.isRoot, "Must pass the root project")
Preconditions.checkState(root.extensions.findByName(EXT_NAME) == null,
"Cannot initialize DiffAndDocs twice")
@@ -248,11 +258,13 @@
}
}
appExtension.applicationVariants.all { v ->
- val task = docsTasks[v.flavorName]
- if (v.buildType.name == "release" && task != null) {
- registerAndroidProjectForDocsTask(task, v)
- task.exclude { fileTreeElement ->
- fileTreeElement.path.endsWith(v.rFile())
+ val taskProvider = docsTasks[v.flavorName]
+ if (v.buildType.name == "release" && taskProvider != null) {
+ registerAndroidProjectForDocsTask(taskProvider, v)
+ taskProvider.configure {
+ it.exclude { fileTreeElement ->
+ fileTreeElement.path.endsWith(v.rFile())
+ }
}
}
}
@@ -280,13 +292,17 @@
strategy.stubs?.forEach { path ->
depHandler.add("${rule.name}CompileOnly", root.files(path))
}
- docsTasks[rule.name]!!.source(prebuiltSources(root, dependency,
- rule.name, resolvedRule))
+ docsTasks[rule.name]!!.configure {
+ it.source(prebuiltSources(root, dependency, rule.name, resolvedRule))
+ }
}
}
}
- private fun tipOfTreeTasks(extension: SupportLibraryExtension, setup: (DoclavaTask) -> Unit) {
+ private fun tipOfTreeTasks(
+ extension: SupportLibraryExtension,
+ setup: (TaskProvider<out DoclavaTask>) -> Unit
+ ) {
rules.filter { rule -> rule.resolve(extension)?.strategy == TipOfTree }
.mapNotNull { rule -> docsTasks[rule.name] }
.forEach(setup)
@@ -297,7 +313,7 @@
* local API diff generation tasks.
*/
fun registerJavaProject(project: Project, extension: SupportLibraryExtension) {
- val compileJava = project.properties["compileJava"] as JavaCompile
+ val compileJava = project.tasks.named("compileJava", JavaCompile::class.java)
registerPrebuilts(extension)
@@ -318,7 +334,9 @@
registerJavaProjectForDocsTask(tasks.generateLocalDiffs, compileJava)
val generateApiDiffsArchiveTask = createGenerateLocalApiDiffsArchiveTask(project,
tasks.generateLocalDiffs)
- generateApiDiffsArchiveTask.dependsOn(tasks.generateLocalDiffs)
+ generateApiDiffsArchiveTask.configure {
+ it.dependsOn(tasks.generateLocalDiffs)
+ }
}
/**
@@ -336,8 +354,10 @@
if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
// include R.file generated for prebuilts
rules.filter { it.resolve(extension)?.strategy is Prebuilts }.forEach { rule ->
- docsTasks[rule.name]?.include { fileTreeElement ->
- fileTreeElement.path.endsWith(variant.rFile())
+ docsTasks[rule.name]?.configure {
+ it.include { fileTreeElement ->
+ fileTreeElement.path.endsWith(variant.rFile())
+ }
}
}
@@ -356,7 +376,9 @@
registerAndroidProjectForDocsTask(tasks.generateLocalDiffs, variant)
val generateApiDiffsArchiveTask = createGenerateLocalApiDiffsArchiveTask(project,
tasks.generateLocalDiffs)
- generateApiDiffsArchiveTask.dependsOn(tasks.generateLocalDiffs)
+ generateApiDiffsArchiveTask.configure {
+ it.dependsOn(tasks.generateLocalDiffs)
+ }
}
}
}
@@ -373,19 +395,26 @@
} else {
extension.project.version()
}
- val docs = docsTasks[rules.name]!!
- // Track API change history.
- docs.addSinceFilesFrom(project.projectDir)
- // Associate current API surface with the Maven artifact.
- val artifact = "${project.group}:${project.name}:$version"
- docs.addArtifact(checkApiTasks.generateApi.apiFile!!.absolutePath, artifact)
- docs.dependsOn(checkApiTasks.generateApi)
+ docsTasks[rules.name]!!.configure { docs ->
+ // Track API change history.
+ docs.addSinceFilesFrom(project.projectDir)
+ // Associate current API surface with the Maven artifact.
+ val artifact = "${project.group}:${project.name}:$version"
+ docs.addArtifact(checkApiTasks.generateApi.get().apiFile!!.absolutePath, artifact)
+ docs.dependsOn(checkApiTasks.generateApi)
+ }
}
}
private fun addCheckApiTasksToGraph(tasks: CheckApiTasks) {
- docsTasks.values.forEach { docs -> docs.dependsOn(tasks.generateApi) }
- anchorTask.dependsOn(tasks.checkApi)
+ docsTasks.values.forEach { docs ->
+ docs.configure {
+ it.dependsOn(tasks.generateApi)
+ }
+ }
+ anchorTask.configure {
+ it.dependsOn(tasks.checkApi)
+ }
}
}
@@ -401,12 +430,18 @@
* generated code may be resolved
* </ul>
*/
-private fun registerJavaProjectForDocsTask(task: Javadoc, javaCompileTask: JavaCompile) {
- task.dependsOn(javaCompileTask)
- task.source(javaCompileTask.source)
- val project = task.project
- task.classpath += project.files(javaCompileTask.classpath) +
- project.files(javaCompileTask.destinationDir)
+private fun registerJavaProjectForDocsTask(
+ docsTaskProvider: TaskProvider<out Javadoc>,
+ javaCompileTaskProvider: TaskProvider<JavaCompile>
+) {
+ docsTaskProvider.configure { docsTask ->
+ docsTask.dependsOn(javaCompileTaskProvider)
+ var javaCompileTask = javaCompileTaskProvider.get()
+ docsTask.source(javaCompileTask.source)
+ val project = docsTask.project
+ docsTask.classpath += project.files(javaCompileTask.classpath) +
+ project.files(javaCompileTask.destinationDir)
+ }
}
/**
@@ -414,16 +449,25 @@
* <p>
* @see #registerJavaProjectForDocsTask
*/
-private fun registerAndroidProjectForDocsTask(task: Javadoc, releaseVariant: BaseVariant) {
+private fun registerAndroidProjectForDocsTask(
+ task: TaskProvider<out Javadoc>,
+ releaseVariant: BaseVariant
+) {
// This code makes a number of unsafe assumptions about Android Gradle Plugin,
// and there's a good chance that this will break in the near future.
- task.dependsOn(releaseVariant.javaCompileProvider.get())
- task.include { fileTreeElement ->
- fileTreeElement.name != "R.java" || fileTreeElement.path.endsWith(releaseVariant.rFile())
+ val javaCompileProvider = releaseVariant.javaCompileProvider
+ task.configure {
+ it.dependsOn(javaCompileProvider)
+ it.include { fileTreeElement ->
+ fileTreeElement.name != "R.java" ||
+ fileTreeElement.path.endsWith(releaseVariant.rFile())
+ }
+ it.source(javaCompileProvider.map {
+ it.source
+ })
+ it.classpath += releaseVariant.getCompileClasspath(null) +
+ it.project.files(javaCompileProvider.get().destinationDir)
}
- task.source(releaseVariant.javaCompileProvider.get().source)
- task.classpath += releaseVariant.getCompileClasspath(null) +
- task.project.files(releaseVariant.javaCompileProvider.get().destinationDir)
}
/**
@@ -456,50 +500,57 @@
*/
private fun createGenerateDiffsTask(
project: Project,
- oldApiTask: ApiXmlConversionTask,
- newApiTask: ApiXmlConversionTask,
+ oldApiTask: TaskProvider<ApiXmlConversionTask>,
+ newApiTask: TaskProvider<ApiXmlConversionTask>,
jdiffConfig: Configuration
-): JDiffTask =
- project.tasks.createWithConfig("generateDiffs", JDiffTask::class.java) {
- // Base classpath is Android SDK, sub-projects add their own.
- classpath = androidJarFile(project)
+): TaskProvider<JDiffTask> =
+ project.tasks.register("generateDiffs", JDiffTask::class.java) {
+ it.apply {
+ // Base classpath is Android SDK, sub-projects add their own.
+ classpath = androidJarFile(project)
- // JDiff properties.
- oldApiXmlFile = oldApiTask.outputApiXmlFile
- newApiXmlFile = newApiTask.outputApiXmlFile
+ // JDiff properties.
+ oldApiXmlFile = oldApiTask.get().outputApiXmlFile
+ newApiXmlFile = newApiTask.get().outputApiXmlFile
- val newApi = newApiXmlFile.name.substringBeforeLast('.')
- val docsDir = File(project.rootProject.docsDir(), "public")
+ val newApi = newApiXmlFile.name.substringBeforeLast('.')
+ val docsDir = File(project.rootProject.docsDir(), "public")
- newJavadocPrefix = "../../../../../reference/"
- destinationDir = File(docsDir, "online/sdk/support_api_diff/${project.name}/$newApi")
+ newJavadocPrefix = "../../../../../reference/"
+ destinationDir = File(docsDir,
+ "online/sdk/support_api_diff/${project.name}/$newApi")
- // Javadoc properties.
- docletpath = jdiffConfig.resolve()
- title = "Support Library API Differences Report"
+ // Javadoc properties.
+ docletpath = jdiffConfig.resolve()
+ title = "Support Library API Differences Report"
- exclude("**/R.java")
- dependsOn(oldApiTask, newApiTask, jdiffConfig)
- doLast {
- project.logger.lifecycle("generated diffs into $destinationDir")
+ exclude("**/R.java")
+ dependsOn(oldApiTask, newApiTask, jdiffConfig)
+ doLast {
+ project.logger.lifecycle("generated diffs into $destinationDir")
+ }
}
}
// Generates a distribution artifact for online docs.
private fun createDistDocsTask(
project: Project,
- generateDocs: DoclavaTask,
+ generateDocs: TaskProvider<out DoclavaTask>,
ruleName: String = ""
-): Zip = project.tasks.createWithConfig("dist${ruleName}Docs", Zip::class.java) {
- dependsOn(generateDocs)
- group = JavaBasePlugin.DOCUMENTATION_GROUP
- description = "Generates distribution artifact for d.android.com-style documentation."
- from(generateDocs.destinationDir)
- baseName = "android-support-$ruleName-docs"
- version = getBuildId()
- destinationDir = project.getDistributionDirectory()
- doLast {
- logger.lifecycle("'Wrote API reference to $archivePath")
+): TaskProvider<Zip> = project.tasks.register("dist${ruleName}Docs", Zip::class.java) {
+ it.apply {
+ dependsOn(generateDocs)
+ group = JavaBasePlugin.DOCUMENTATION_GROUP
+ description = "Generates distribution artifact for d.android.com-style documentation."
+ from(generateDocs.map {
+ it.destinationDir
+ })
+ baseName = "android-support-$ruleName-docs"
+ version = getBuildId()
+ destinationDir = project.getDistributionDirectory()
+ doLast {
+ logger.lifecycle("'Wrote API reference to $archivePath")
+ }
}
}
@@ -541,56 +592,60 @@
destDir: File,
taskName: String = "generateDocs",
offline: Boolean
-): GenerateDocsTask =
- project.tasks.createWithConfig(taskName, GenerateDocsTask::class.java) {
- dependsOn(generateSdkApiTask, doclavaConfig)
- group = JavaBasePlugin.DOCUMENTATION_GROUP
- description = "Generates d.android.com-style documentation. To generate offline docs " +
- "use \'-PofflineDocs=true\' parameter."
+): TaskProvider<GenerateDocsTask> =
+ project.tasks.register(taskName, GenerateDocsTask::class.java) {
+ it.apply {
+ dependsOn(generateSdkApiTask, doclavaConfig)
+ group = JavaBasePlugin.DOCUMENTATION_GROUP
+ description = "Generates d.android.com-style documentation. To generate offline " +
+ "docs use \'-PofflineDocs=true\' parameter."
- setDocletpath(doclavaConfig.resolve())
- destinationDir = File(destDir, if (offline) "offline" else "online")
- classpath = androidJarFile(project)
- checksConfig = GENERATE_DOCS_CONFIG
- addSinceFilesFrom(supportRootFolder)
+ setDocletpath(doclavaConfig.resolve())
+ destinationDir = File(destDir, if (offline) "offline" else "online")
+ classpath = androidJarFile(project)
+ checksConfig = GENERATE_DOCS_CONFIG
+ addSinceFilesFrom(supportRootFolder)
- coreJavadocOptions {
- addStringOption("templatedir",
+ coreJavadocOptions {
+ addStringOption("templatedir",
"$supportRootFolder/../../external/doclava/res/assets/templates-sdk")
- addStringOption("samplesdir", "$supportRootFolder/samples")
- addMultilineMultiValueOption("federate").value = listOf(
+ addStringOption("samplesdir", "$supportRootFolder/samples")
+ addMultilineMultiValueOption("federate").value = listOf(
listOf("Android", "https://developer.android.com")
- )
- addMultilineMultiValueOption("federationapi").value = listOf(
+ )
+ addMultilineMultiValueOption("federationapi").value = listOf(
listOf("Android", generateSdkApiTask.apiFile?.absolutePath)
- )
- addMultilineMultiValueOption("hdf").value = listOf(
+ )
+ addMultilineMultiValueOption("hdf").value = listOf(
listOf("android.whichdoc", "online"),
listOf("android.hasSamples", "true"),
listOf("dac", "true")
- )
+ )
- // Specific to reference docs.
- if (!offline) {
- addStringOption("toroot", "/")
- addBooleanOption("devsite", true)
- addBooleanOption("yamlV2", true)
- addStringOption("dac_libraryroot", dacOptions.libraryroot)
- addStringOption("dac_dataname", dacOptions.dataname)
+ // Specific to reference docs.
+ if (!offline) {
+ addStringOption("toroot", "/")
+ addBooleanOption("devsite", true)
+ addBooleanOption("yamlV2", true)
+ addStringOption("dac_libraryroot", dacOptions.libraryroot)
+ addStringOption("dac_dataname", dacOptions.dataname)
+ }
}
- }
- addArtifactsAndSince()
+ addArtifactsAndSince()
+ }
}
private fun createGenerateLocalApiDiffsArchiveTask(
project: Project,
- diffTask: JDiffTask
-): Zip = project.tasks.createWithConfig("generateLocalApiDiffsArchive", Zip::class.java) {
+ diffTask: TaskProvider<JDiffTask>
+): TaskProvider<Zip> = project.tasks.register("generateLocalApiDiffsArchive", Zip::class.java) {
val docsDir = project.rootProject.docsDir()
- from(diffTask.destinationDir)
- destinationDir = File(docsDir, "online/sdk/support_api_diff/${project.name}")
- to("${project.version}.zip")
+ it.from(diffTask.map {
+ it.destinationDir
+ })
+ it.destinationDir = File(docsDir, "online/sdk/support_api_diff/${project.name}")
+ it.to("${project.version}.zip")
}
private fun sdkApiFile(project: Project) = File(project.docsDir(), "release/sdk_current.txt")
diff --git a/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
index a8532b7..10f0a65 100644
--- a/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
@@ -23,9 +23,10 @@
import org.gradle.api.DomainObjectSet
import org.gradle.api.Project
import org.gradle.api.logging.Logging
+import org.gradle.api.plugins.JavaPlugin.COMPILE_JAVA_TASK_NAME
+import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.kotlin.dsl.apply
-import org.gradle.kotlin.dsl.withType
const val ERROR_PRONE_TASK = "runErrorProne"
@@ -34,20 +35,18 @@
fun Project.configureErrorProneForJava() {
val toolChain = createErrorProneToolChain()
- tasks.withType<JavaCompile>().all { task ->
- log.info("Configuring error-prone for ${task.path}")
- makeErrorProneTask(task, toolChain)
- }
+ val javaCompileProvider = project.tasks.named(COMPILE_JAVA_TASK_NAME, JavaCompile::class.java)
+ log.info("Configuring error-prone for ${project.path}")
+ makeErrorProneTask(javaCompileProvider, toolChain)
}
fun Project.configureErrorProneForAndroid(variants: DomainObjectSet<out BaseVariant>) {
val toolChain = createErrorProneToolChain()
variants.all { variant ->
if (variant.buildType.name == BuilderConstants.DEBUG) {
- @Suppress("DEPRECATION")
- val task = variant.javaCompileProvider.get()
+ val task = variant.javaCompileProvider
- log.info("Configuring error-prone for ${task.path}")
+ log.info("Configuring error-prone for ${variant.name}'s java compile")
makeErrorProneTask(task, toolChain)
}
}
@@ -106,23 +105,30 @@
* Given a [JavaCompile] task, creates a task that runs the ErrorProne compiler with the same
* settings.
*/
-private fun Project.makeErrorProneTask(compileTask: JavaCompile, toolChain: ErrorProneToolChain) {
- if (tasks.findByName(ERROR_PRONE_TASK) != null) {
- return
- }
+private fun Project.makeErrorProneTask(
+ compileTaskProvider: TaskProvider<JavaCompile>,
+ toolChain: ErrorProneToolChain
+) {
+ val provider = maybeRegister<JavaCompile>(
+ name = ERROR_PRONE_TASK,
+ onConfigure = {
+ val compileTask = compileTaskProvider.get()
+ it.classpath = compileTask.classpath
- val errorProneTask = tasks.create(ERROR_PRONE_TASK, JavaCompile::class.java)
- errorProneTask.classpath = compileTask.classpath
-
- errorProneTask.source = compileTask.source
- errorProneTask.destinationDir = file(buildDir.resolve("errorProne"))
- errorProneTask.options.compilerArgs = compileTask.options.compilerArgs.toMutableList()
- errorProneTask.options.annotationProcessorPath = compileTask.options.annotationProcessorPath
- errorProneTask.options.bootstrapClasspath = compileTask.options.bootstrapClasspath
- errorProneTask.sourceCompatibility = compileTask.sourceCompatibility
- errorProneTask.targetCompatibility = compileTask.targetCompatibility
- errorProneTask.configureWithErrorProne(toolChain)
- errorProneTask.dependsOn(compileTask.dependsOn)
-
- tasks.getByName("check").dependsOn(errorProneTask)
+ it.source = compileTask.source
+ it.destinationDir = file(buildDir.resolve("errorProne"))
+ it.options.compilerArgs = compileTask.options.compilerArgs.toMutableList()
+ it.options.annotationProcessorPath = compileTask.options.annotationProcessorPath
+ it.options.bootstrapClasspath = compileTask.options.bootstrapClasspath
+ it.sourceCompatibility = compileTask.sourceCompatibility
+ it.targetCompatibility = compileTask.targetCompatibility
+ it.configureWithErrorProne(toolChain)
+ it.dependsOn(compileTask.dependsOn)
+ },
+ onRegister = { errorProneProvider ->
+ tasks.named("check").configure {
+ it.dependsOn(errorProneProvider)
+ }
+ }
+ )
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
index 170e2f3..2914133 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -61,6 +61,7 @@
const val RECOMMENDATION = "androidx.recommendation"
const val RECYCLERVIEW = "androidx.recyclerview"
const val SAVEDSTATE = "androidx.savedstate"
+ const val SECURITY = "androidx.security"
const val SHARETARGET = "androidx.sharetarget"
const val SLICE = "androidx.slice"
const val REMOTECALLBACK = "androidx.remotecallback"
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index dda3a53..d21d40b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -23,78 +23,79 @@
val ACTIVITY = Version("1.0.0-alpha05")
val ANIMATION = Version("1.0.0-alpha01")
val ANIMATION_TESTING = Version("1.0.0")
- val ANNOTATION = Version("1.1.0-alpha01")
+ val ANNOTATION = Version("1.1.0-alpha02")
val APPCOMPAT = Version("1.1.0-alpha03")
val ARCH_CORE = Version("2.0.0")
val ARCH_CORE_TESTING = ARCH_CORE
val ARCH_RUNTIME = Version("2.0.1-alpha01")
- val ASYNCLAYOUTINFLATER = Version("1.0.0")
+ val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
val BENCHMARK = Version("1.0.0-alpha01")
val BIOMETRIC = Version("1.0.0-alpha04")
- val BROWSER = Version("1.0.0")
- val CAR = Version("1.0.0-alpha6")
+ val BROWSER = Version("1.1.0-alpha01")
+ val CAR = Version("1.0.0-alpha7")
val CAR_CLUSTER = Version("1.0.0-alpha5")
val CAR_MODERATOR = Version("1.0.0-alpha1")
- val CARDVIEW = Version("1.0.0")
- val COLLECTION = Version("1.1.0-alpha02")
- val CONTENTPAGER = Version("1.0.0")
+ val CARDVIEW = Version("1.1.0-alpha01")
+ val COLLECTION = Version("1.1.0-alpha03")
+ val CONTENTPAGER = Version("1.1.0-alpha01")
val COORDINATORLAYOUT = Version("1.1.0-alpha02")
- val CORE = Version("1.1.0-alpha04")
- val CURSORADAPTER = Version("1.0.0")
- val CUSTOMVIEW = Version("1.0.0")
- val DOCUMENTFILE = Version("1.0.0")
- val DRAWERLAYOUT = Version("1.0.0")
- val DYNAMICANIMATION = Version("1.0.0")
- val DYNAMICANIMATION_KTX = Version("1.0.0-alpha01")
- val EMOJI = Version("1.0.0")
+ val CORE = Version("1.1.0-alpha05")
+ val CURSORADAPTER = Version("1.1.0-alpha01")
+ val CUSTOMVIEW = Version("1.1.0-alpha01")
+ val DOCUMENTFILE = Version("1.1.0-alpha01")
+ val DRAWERLAYOUT = Version("1.1.0-alpha01")
+ val DYNAMICANIMATION = Version("1.1.0-alpha01")
+ val DYNAMICANIMATION_KTX = Version("1.0.0-alpha02")
+ val EMOJI = Version("1.1.0-alpha01")
val ENTERPRISE = Version("1.0.0-alpha01")
- val EXIFINTERFACE = Version("1.0.0")
+ val EXIFINTERFACE = Version("1.1.0-alpha01")
val FRAGMENT = Version("1.1.0-alpha05")
val FUTURES = Version("1.0.0-alpha03")
val GRIDLAYOUT = Version("1.1.0-alpha01")
- val HEIFWRITER = Version("1.0.0")
- val INTERPOLATOR = Version("1.0.0")
- val JETIFIER = Version("1.0.0-beta03")
- val LEANBACK = Version("1.1.0-alpha01")
- val LEANBACK_PREFERENCE = Version("1.1.0-alpha01")
- val LEGACY = Version("1.0.0")
- val LOCALBROADCASTMANAGER = Version("1.1.0-alpha01")
- val LIFECYCLE = Version("2.1.0-alpha02")
+ val HEIFWRITER = Version("1.1.0-alpha01")
+ val INTERPOLATOR = Version("1.1.0-alpha01")
+ val JETIFIER = Version("1.0.0-beta04")
+ val LEANBACK = Version("1.1.0-alpha02")
+ val LEANBACK_PREFERENCE = Version("1.1.0-alpha02")
+ val LEGACY = Version("1.1.0-alpha01")
+ val LOCALBROADCASTMANAGER = Version("1.1.0-alpha02")
+ val LIFECYCLE = Version("2.1.0-alpha03")
val LIFECYCLES_SAVEDSTATE = Version("1.0.0-alpha01")
val LOADER = Version("1.1.0-beta01")
- val MEDIA = Version("1.1.0-alpha01")
+ val MEDIA = Version("1.1.0-alpha02")
val MEDIA2 = Version("1.0.0-alpha05")
- val MEDIA2_EXOPLAYER = Version("1.0.0-alpha01")
+ val MEDIA2_EXOPLAYER = Version("1.0.0-alpha02")
val MEDIA2_WIDGET = Version("1.0.0-alpha07")
- val MEDIAROUTER = Version("1.1.0-alpha01")
- val NAVIGATION = Version("1.0.0-beta01")
+ val MEDIAROUTER = Version("1.1.0-alpha02")
+ val NAVIGATION = Version("1.0.0-beta02")
val NAVIGATION_TESTING = Version("1.0.0-alpha08") // Unpublished
val PAGING = Version("2.2.0-alpha01")
val PALETTE = Version("1.1.0-alpha01")
- val PRINT = Version("1.0.0")
- val PERCENTLAYOUT = Version("1.0.0")
+ val PRINT = Version("1.1.0-alpha01")
+ val PERCENTLAYOUT = Version("1.1.0-alpha01")
val PERSISTENCE = Version("2.0.0")
- val PREFERENCE = Version("1.1.0-alpha03")
- val RECOMMENDATION = Version("1.0.0")
- val RECYCLERVIEW = Version("1.1.0-alpha02")
+ val PREFERENCE = Version("1.1.0-alpha04")
+ val RECOMMENDATION = Version("1.1.0-alpha01")
+ val RECYCLERVIEW = Version("1.1.0-alpha03")
val REMOTECALLBACK = Version("1.0.0-alpha02")
val ROOM = Version("2.1.0-alpha05")
val SAVEDSTATE = Version("1.0.0-alpha01")
+ val SECURITY = Version("1.0.0-alpha01")
val SHARETARGET = Version("1.0.0-alpha01")
val SLICE = Version("1.1.0-alpha01")
- val SLICE_BENCHMARK = Version("1.0.0")
- val SLICE_BUILDERS_KTX = Version("1.0.0-alpha6")
- val SLIDINGPANELAYOUT = Version("1.0.0")
+ val SLICE_BENCHMARK = Version("1.1.0-alpha01")
+ val SLICE_BUILDERS_KTX = Version("1.0.0-alpha07")
+ val SLIDINGPANELAYOUT = Version("1.1.0-alpha01")
val SWIPE_REFRESH_LAYOUT = Version("1.1.0-alpha01")
- val TEXTCLASSIFIER = Version("1.0.0-alpha02")
+ val TEXTCLASSIFIER = Version("1.0.0-alpha03")
val TRANSITION = Version("1.1.0-alpha02")
- val TVPROVIDER = Version("1.0.0")
- val VECTORDRAWABLE = Version("1.1.0-alpha01")
- val VECTORDRAWABLE_ANIMATED = Version("1.1.0-alpha01")
+ val TVPROVIDER = Version("1.1.0-alpha01")
+ val VECTORDRAWABLE = Version("1.1.0-alpha02")
+ val VECTORDRAWABLE_ANIMATED = Version("1.1.0-alpha02")
val VERSIONED_PARCELABLE = Version("1.1.0-alpha02")
val VIEWPAGER = Version("1.1.0-alpha01")
- val VIEWPAGER2 = Version("1.0.0-alpha01")
- val WEAR = Version("1.0.0")
+ val VIEWPAGER2 = Version("1.0.0-alpha02")
+ val WEAR = Version("1.1.0-alpha01")
val WEBKIT = Version("1.1.0-alpha01")
- val WORKMANAGER = Version("1.0.0-beta04")
+ val WORKMANAGER = Version("1.0.0-rc01")
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
index be1d3e8..520fae6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -25,9 +25,13 @@
apply(mapOf("plugin" to "com.android.lint"))
// Create fake variant tasks since that is what is invoked on CI and by developers.
- val lintTask = tasks.getByName("lint")
- tasks.create("lintDebug").dependsOn(lintTask)
- tasks.create("lintRelease").dependsOn(lintTask)
+ val lintTask = tasks.named("lint")
+ tasks.register("lintDebug") {
+ it.dependsOn(lintTask)
+ }
+ tasks.register("lintRelease") {
+ it.dependsOn(lintTask)
+ }
val lintOptions = extensions.getByType<LintOptions>()
project.configureLint(lintOptions, extension)
diff --git a/buildSrc/src/main/kotlin/androidx/build/ProjectExt.kt b/buildSrc/src/main/kotlin/androidx/build/ProjectExt.kt
new file mode 100644
index 0000000..8dcfd8d
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/ProjectExt.kt
@@ -0,0 +1,67 @@
+/**
+ * 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.build
+
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.tasks.TaskProvider
+import java.util.Collections
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * Holder class used for lazily registering tasks using the new Lazy task execution API.
+ */
+data class LazyTaskRegistry(
+ private val names: MutableSet<String> = Collections.synchronizedSet(mutableSetOf())
+) {
+ fun <T : Any?> once(name: String, f: () -> T): T? {
+ if (names.add(name)) {
+ return f()
+ }
+ return null
+ }
+
+ companion object {
+ private const val KEY = "AndroidXAutoRegisteredTasks"
+ private val lock = ReentrantLock()
+ fun get(project: Project): LazyTaskRegistry {
+ val existing = project.extensions.findByName(KEY) as? LazyTaskRegistry
+ if (existing != null) {
+ return existing
+ }
+ return lock.withLock {
+ project.extensions.findByName(KEY) as? LazyTaskRegistry
+ ?: LazyTaskRegistry().also {
+ project.extensions.add(KEY, it)
+ }
+ }
+ }
+ }
+}
+
+inline fun <reified T : Task> Project.maybeRegister(
+ name: String,
+ crossinline onConfigure: (T) -> Unit,
+ crossinline onRegister: (TaskProvider<T>) -> Unit
+): TaskProvider<T> {
+ @Suppress("UNCHECKED_CAST")
+ return LazyTaskRegistry.get(project).once(name) {
+ tasks.register(name, T::class.java) {
+ onConfigure(it)
+ }.also(onRegister)
+ } ?: tasks.named(name) as TaskProvider<T>
+}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index 74105b1..a290522 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -28,7 +28,7 @@
prebuilts(LibraryGroups.ACTIVITY, "1.0.0-alpha04")
prebuilts(LibraryGroups.ANNOTATION, "1.1.0-alpha01")
ignore(LibraryGroups.APPCOMPAT, "appcompat-resources")
- prebuilts(LibraryGroups.APPCOMPAT, "1.1.0-alpha01")
+ prebuilts(LibraryGroups.APPCOMPAT, "1.1.0-alpha02")
prebuilts(LibraryGroups.ASYNCLAYOUTINFLATER, "1.0.0")
prebuilts(LibraryGroups.BIOMETRIC, "biometric", "1.0.0-alpha03")
prebuilts(LibraryGroups.BROWSER, "1.0.0")
@@ -47,11 +47,11 @@
prebuilts(LibraryGroups.CUSTOMVIEW, "1.0.0")
prebuilts(LibraryGroups.DOCUMENTFILE, "1.0.0")
prebuilts(LibraryGroups.DRAWERLAYOUT, "1.0.0")
- ignore(LibraryGroups.DYNAMICANIMATION, "dynamicanimation-ktx")
+ prebuilts(LibraryGroups.DYNAMICANIMATION, "dynamicanimation-ktx", "1.0.0-alpha01")
prebuilts(LibraryGroups.DYNAMICANIMATION, "1.0.0")
prebuilts(LibraryGroups.EMOJI, "1.0.0")
prebuilts(LibraryGroups.EXIFINTERFACE, "1.0.0")
- prebuilts(LibraryGroups.FRAGMENT, "1.1.0-alpha02")
+ prebuilts(LibraryGroups.FRAGMENT, "1.1.0-alpha04")
prebuilts(LibraryGroups.GRIDLAYOUT, "1.0.0")
prebuilts(LibraryGroups.HEIFWRITER, "1.0.0")
prebuilts(LibraryGroups.INTERPOLATOR, "1.0.0")
@@ -68,8 +68,8 @@
prebuilts(LibraryGroups.MEDIAROUTER, "1.1.0-alpha01")
prebuilts(LibraryGroups.PALETTE, "1.0.0")
prebuilts(LibraryGroups.PERCENTLAYOUT, "1.0.0")
- prebuilts(LibraryGroups.PREFERENCE, "preference-ktx", "1.1.0-alpha02")
- prebuilts(LibraryGroups.PREFERENCE, "1.1.0-alpha02")
+ prebuilts(LibraryGroups.PREFERENCE, "preference-ktx", "1.1.0-alpha03")
+ prebuilts(LibraryGroups.PREFERENCE, "1.1.0-alpha03")
prebuilts(LibraryGroups.PRINT, "1.0.0")
prebuilts(LibraryGroups.RECOMMENDATION, "1.0.0")
prebuilts(LibraryGroups.RECYCLERVIEW, "recyclerview", "1.1.0-alpha02")
@@ -84,12 +84,13 @@
prebuilts(LibraryGroups.SLICE, "slice-view", "1.0.0")
prebuilts(LibraryGroups.SLIDINGPANELAYOUT, "1.0.0")
prebuilts(LibraryGroups.SWIPEREFRESHLAYOUT, "1.1.0-alpha01")
- prebuilts(LibraryGroups.TEXTCLASSIFIER, "1.0.0-alpha01")
+ prebuilts(LibraryGroups.TEXTCLASSIFIER, "1.0.0-alpha02")
prebuilts(LibraryGroups.TRANSITION, "1.1.0-alpha01")
prebuilts(LibraryGroups.TVPROVIDER, "1.0.0")
prebuilts(LibraryGroups.VECTORDRAWABLE, "1.1.0-alpha01")
prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0-alpha01")
prebuilts(LibraryGroups.VIEWPAGER, "1.0.0")
+ prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-alpha01")
prebuilts(LibraryGroups.WEAR, "1.0.0")
.addStubs("wear/wear_stubs/com.google.android.wearable-stubs.jar")
prebuilts(LibraryGroups.WEBKIT, "1.0.0")
@@ -106,8 +107,8 @@
prebuilts(LibraryGroups.ARCH_CORE, "2.0.0")
prebuilts(LibraryGroups.PAGING, "2.1.0")
ignore(LibraryGroups.NAVIGATION, "navigation-testing")
- prebuilts(LibraryGroups.NAVIGATION, "1.0.0-beta01")
- prebuilts(LibraryGroups.WORKMANAGER, "1.0.0-beta04")
+ prebuilts(LibraryGroups.NAVIGATION, "1.0.0-beta02")
+ prebuilts(LibraryGroups.WORKMANAGER, "1.0.0-rc01")
default(Ignore)
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/Release.kt b/buildSrc/src/main/kotlin/androidx/build/Release.kt
index 55657a6..8ef06ab 100644
--- a/buildSrc/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/Release.kt
@@ -18,6 +18,7 @@
import androidx.build.gmaven.GMavenVersionChecker
import org.gradle.api.Action
import org.gradle.api.Project
+import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.Upload
import org.gradle.api.tasks.bundling.Zip
import java.io.File
@@ -211,10 +212,12 @@
projectName = project.name,
version = version.toString()
)
- val uploadTask = project.tasks.getByName("uploadArchives") as Upload
+ val uploadTask = project.tasks.named("uploadArchives", Upload::class.java)
zipTasks.forEach {
- it.candidates.add(artifact)
- it.dependsOn(uploadTask)
+ it.configure {
+ it.candidates.add(artifact)
+ it.dependsOn(uploadTask)
+ }
}
}
@@ -255,40 +258,53 @@
/**
* Creates and returns the task that generates the combined gmaven diff file for all projects.
*/
- private fun getGlobalReleaseZipTask(project: Project): GMavenZipTask {
+ private fun getGlobalReleaseZipTask(project: Project): TaskProvider<GMavenZipTask> {
val taskName = "${DIFF_TASK_PREFIX}ForAll"
- return project.rootProject.tasks.findByName(taskName) as? GMavenZipTask
- ?: project.rootProject.tasks.create(
- taskName, GMavenZipTask::class.java,
- GMavenZipTask.ConfigAction(getParams(project))
- )
+ return project.rootProject.maybeRegister(
+ name = taskName,
+ onConfigure = {
+ GMavenZipTask.ConfigAction(getParams(project)).execute(it)
+ },
+ onRegister = {
+ }
+ )
}
/**
* Creates and returns the task that includes all projects regardless of their release status.
*/
- private fun getGlobalFullZipTask(project: Project): GMavenZipTask {
- val taskName = FULL_ARCHIVE_TASK_NAME
- return project.rootProject.tasks.findByName(taskName) as? GMavenZipTask
- ?: project.rootProject.tasks.create(
- taskName, GMavenZipTask::class.java,
- GMavenZipTask.ConfigAction(getParams(project).copy(
- includeReleased = true,
- includeMetadata = true
- ))
- )
+ private fun getGlobalFullZipTask(project: Project): TaskProvider<GMavenZipTask> {
+ return project.rootProject.maybeRegister(
+ name = FULL_ARCHIVE_TASK_NAME,
+ onConfigure = {
+ GMavenZipTask.ConfigAction(
+ getParams(project).copy(
+ includeReleased = true,
+ includeMetadata = true
+ )
+ ).execute(it)
+ },
+ onRegister = {
+ }
+ )
}
/**
* Creates and returns the zip task that includes artifacts only in the given maven group.
*/
- private fun getGroupReleaseZipTask(project: Project, group: String): GMavenZipTask {
+ private fun getGroupReleaseZipTask(
+ project: Project,
+ group: String
+ ): TaskProvider<GMavenZipTask> {
val taskName = "${DIFF_TASK_PREFIX}For${groupToTaskNameSuffix(group)}"
- return project.rootProject.tasks.findByName(taskName) as? GMavenZipTask
- ?: project.rootProject.tasks.create(
- taskName, GMavenZipTask::class.java,
- GMavenZipTask.ConfigAction(getParams(project, group))
- )
+ return project.rootProject.maybeRegister(
+ name = taskName,
+ onConfigure = {
+ GMavenZipTask.ConfigAction(getParams(project, group)).execute(it)
+ },
+ onRegister = {
+ }
+ )
}
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/SdkHelper.kt b/buildSrc/src/main/kotlin/androidx/build/SdkHelper.kt
index ca48814..39b528f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SdkHelper.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SdkHelper.kt
@@ -28,9 +28,13 @@
val props = File(supportRoot, "local.properties")
// gradle always deliminate directories with '/' regardless of the OS.
// So convert deliminator here.
- val gradlePath = sdkPath.getAbsolutePath().replace(File.separator, "/")
- props.printWriter().use { out ->
- out.println("sdk.dir=$gradlePath")
+ val gradlePath = sdkPath.absolutePath.replace(File.separator, "/")
+ val expectedContents = "sdk.dir=$gradlePath"
+ if (!props.exists() || props.readText(Charsets.UTF_8).trim() != expectedContents) {
+ props.printWriter().use { out ->
+ out.println(expectedContents)
+ }
+ println("updated local.properties")
}
} else {
throw Exception("You are using non androidx-master-dev checkout. You need to check out " +
diff --git a/buildSrc/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt b/buildSrc/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt
index ef6ca7a..daad28e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt
@@ -33,7 +33,7 @@
return@all // Skip non-release builds.
}
- val sourceJar = tasks.create("sourceJar${variant.name.capitalize()}", Jar::class.java) {
+ val sourceJar = tasks.register("sourceJar${variant.name.capitalize()}", Jar::class.java) {
it.classifier = "sources"
it.from(extension.sourceSets.getByName("main").java.srcDirs)
}
@@ -45,7 +45,7 @@
* Sets up a source jar task for a Java library project.
*/
fun Project.configureSourceJarForJava() {
- val sourceJar = tasks.create("sourceJar", Jar::class.java) {
+ val sourceJar = tasks.register("sourceJar", Jar::class.java) {
it.classifier = "sources"
val convention = convention.getPlugin<JavaPluginConvention>()
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt
index 34daccf..28f5356 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt
@@ -39,7 +39,6 @@
val supportLibraryExtension = project.extensions.create("supportLibrary",
SupportLibraryExtension::class.java, project)
- project.setupVersion(supportLibraryExtension)
project.configureMavenArtifactUpload(supportLibraryExtension)
// Workaround for concurrentfuture
@@ -80,12 +79,13 @@
library.libraryVariants.all { libraryVariant ->
if (libraryVariant.getBuildType().getName().equals("debug")) {
- val javaCompile = libraryVariant.javaCompileProvider.get()
- if (supportLibraryExtension.failOnUncheckedWarnings) {
- javaCompile.options.compilerArgs.add("-Xlint:unchecked")
- }
- if (supportLibraryExtension.failOnDeprecationWarnings) {
- javaCompile.options.compilerArgs.add("-Xlint:deprecation")
+ libraryVariant.javaCompileProvider.configure { javaCompile ->
+ if (supportLibraryExtension.failOnUncheckedWarnings) {
+ javaCompile.options.compilerArgs.add("-Xlint:unchecked")
+ }
+ if (supportLibraryExtension.failOnDeprecationWarnings) {
+ javaCompile.options.compilerArgs.add("-Xlint:deprecation")
+ }
}
}
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportJavaLibraryPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/SupportJavaLibraryPlugin.kt
index bc5941d..f8299a0 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportJavaLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportJavaLibraryPlugin.kt
@@ -34,7 +34,6 @@
val supportLibraryExtension = project.extensions.create("supportLibrary",
SupportLibraryExtension::class.java, project)
- project.setupVersion(supportLibraryExtension)
project.configureMavenArtifactUpload(supportLibraryExtension)
project.apply(mapOf("plugin" to "java"))
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportKotlinLibraryPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/SupportKotlinLibraryPlugin.kt
index b84667a..b5359be3 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportKotlinLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportKotlinLibraryPlugin.kt
@@ -27,7 +27,6 @@
val supportLibraryExtension = project.extensions.create("supportLibrary",
SupportLibraryExtension::class.java, project)
- project.setupVersion(supportLibraryExtension)
project.configureMavenArtifactUpload(supportLibraryExtension)
project.apply(mapOf("plugin" to "kotlin"))
project.apply(mapOf("plugin" to "kotlin-kapt"))
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt b/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt
index a7339b0..07474ea 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt
@@ -19,13 +19,16 @@
import groovy.lang.Closure
import org.gradle.api.Project
import java.util.ArrayList
+import kotlin.properties.Delegates
/**
* Extension for [SupportAndroidLibraryPlugin] and [SupportJavaLibraryPlugin].
*/
open class SupportLibraryExtension(val project: Project) {
var name: String? = null
- var mavenVersion: Version? = null
+ var mavenVersion: Version? by Delegates.observable<Version?>(null) { _, _, new: Version? ->
+ project.version = new?.toString()
+ }
var mavenGroup: String? = null
var description: String? = null
var inceptionYear: String? = null
diff --git a/buildSrc/src/main/kotlin/androidx/build/VersionFileWriterTask.kt b/buildSrc/src/main/kotlin/androidx/build/VersionFileWriterTask.kt
index 2eaa79f..fce3661 100644
--- a/buildSrc/src/main/kotlin/androidx/build/VersionFileWriterTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/VersionFileWriterTask.kt
@@ -55,25 +55,29 @@
* @param project an Android Library project.
*/
fun Project.configureVersionFileWriter(library: LibraryExtension) {
- val writeVersionFile = tasks.create("writeVersionFile",
+ val writeVersionFile = tasks.register("writeVersionFile",
VersionFileWriterTask::class.java)
afterEvaluate {
- val group = properties["group"] as String
- val artifactId = properties["name"] as String
- val version = properties["version"] as String
+ writeVersionFile.configure {
+ val group = properties["group"] as String
+ val artifactId = properties["name"] as String
+ val version = properties["version"] as String
- // Add a java resource file to the library jar for version tracking purposes.
- val artifactName = File(
+ // Add a java resource file to the library jar for version tracking purposes.
+ val artifactName = File(
buildDir,
String.format(VERSION_FILE_PATH, group, artifactId))
- writeVersionFile.version = version
- writeVersionFile.outputFile = artifactName
+ it.version = version
+ it.outputFile = artifactName
+ }
}
library.libraryVariants.all {
- it.processJavaResourcesProvider.get().dependsOn(writeVersionFile)
+ it.processJavaResourcesProvider.configure {
+ it.dependsOn(writeVersionFile)
+ }
}
val resources = library.sourceSets.getByName("main").resources
@@ -83,4 +87,4 @@
includes.add("META-INF/*.version")
resources.setIncludes(includes)
}
-}
\ No newline at end of file
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiLocation.kt b/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiLocation.kt
index 6c48365..6b9b311d 100644
--- a/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiLocation.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiLocation.kt
@@ -21,7 +21,7 @@
import androidx.build.Version
// An ApiLocation contains the filepath of a public API and restricted API of a library
-data class ApiLocation (
+data class ApiLocation(
// file specifying the public API of the library
val publicApiFile: File,
// file specifying the restricted API (marked by the RestrictTo annotation) of the library
@@ -46,7 +46,7 @@
}
// An ApiViolationExclusions contains the paths of the API exclusions files for an API
-data class ApiViolationExclusions (
+data class ApiViolationExclusions(
val publicApiFile: File,
val restrictedApiFile: File
) {
diff --git a/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt b/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt
index 41d3b4e..b770e1a 100644
--- a/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt
@@ -19,7 +19,6 @@
import androidx.build.SupportLibraryExtension
import androidx.build.Version
import androidx.build.androidJarFile
-import androidx.build.createWithConfig
import androidx.build.doclava.CHECK_API_CONFIG_DEVELOP
import androidx.build.doclava.CHECK_API_CONFIG_PATCH
import androidx.build.doclava.CHECK_API_CONFIG_RELEASE
@@ -32,15 +31,16 @@
import androidx.build.version
import org.gradle.api.GradleException
import org.gradle.api.Project
-import org.gradle.api.Task
import org.gradle.api.artifacts.Configuration
import org.gradle.api.plugins.JavaBasePlugin
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.TaskProvider
import java.io.File
data class CheckApiTasks(
- val generateApi: DoclavaTask,
- val checkApi: CheckApiTask,
- val generateLocalDiffs: JDiffTask
+ val generateApi: TaskProvider<DoclavaTask>,
+ val checkApi: TaskProvider<CheckApiTask>,
+ val generateLocalDiffs: TaskProvider<JDiffTask>
)
enum class ApiType {
@@ -53,8 +53,8 @@
*/
fun initializeApiChecksForProject(
project: Project,
- aggregateOldApiTxtsTask: ConcatenateFilesTask,
- aggregateNewApiTxtsTask: ConcatenateFilesTask
+ aggregateOldApiTxtsTask: TaskProvider<ConcatenateFilesTask>,
+ aggregateNewApiTxtsTask: TaskProvider<ConcatenateFilesTask>
): CheckApiTasks {
if (!project.hasProperty("docsDir")) {
project.extensions.add("docsDir", File(project.rootProject.docsDir(), project.name))
@@ -64,7 +64,9 @@
val doclavaConfiguration = project.rootProject.configurations.getByName("doclava")
val docletClasspath = doclavaConfiguration.resolve()
val generateApi = createGenerateApiTask(project, docletClasspath)
- generateApi.dependsOn(doclavaConfiguration)
+ generateApi.configure {
+ it.dependsOn(doclavaConfiguration)
+ }
// for verifying that the API surface has not broken since the last minor release
val lastReleasedApiFile = project.getRequiredCompatibilityApiFile()
@@ -77,14 +79,20 @@
docletClasspath,
CHECK_API_CONFIG_RELEASE,
lastReleasedApiFile,
- generateApi.apiFile!!,
+ generateApi.map {
+ it.apiFile!!
+ },
whitelistFile)
- checkApiRelease.dependsOn(generateApi)
+ checkApiRelease.configure {
+ it.dependsOn(generateApi)
+ }
// Allow a comma-delimited list of whitelisted errors.
if (project.hasProperty("ignore")) {
- checkApiRelease.whitelistErrors = (project.properties["ignore"] as String)
- .split(',').toSet()
+ checkApiRelease.configure {
+ it.whitelistErrors = (project.properties["ignore"] as String)
+ .split(',').toSet()
+ }
}
// Check whether the development API surface has changed.
@@ -95,25 +103,31 @@
docletClasspath,
verifyConfig,
currentApiFile,
- generateApi.apiFile!!,
+ generateApi.map {
+ it.apiFile!!
+ },
null)
- checkApi.dependsOn(generateApi, checkApiRelease)
-
- checkApi.group = JavaBasePlugin.VERIFICATION_GROUP
- checkApi.description = "Verify the API surface."
+ checkApi.configure {
+ it.dependsOn(generateApi, checkApiRelease)
+ it.group = JavaBasePlugin.VERIFICATION_GROUP
+ it.description = "Verify the API surface."
+ }
val updateApiTask = createUpdateApiTask(project, checkApiRelease)
- updateApiTask.dependsOn(checkApiRelease)
+ updateApiTask.configure {
+ it.dependsOn(checkApiRelease)
+ }
val oldApiTxt = getOldApiTxtForDocDiffs(project)
if (oldApiTxt != null) {
- aggregateOldApiTxtsTask.addInput(project.name, oldApiTxt)
+ aggregateOldApiTxtsTask.configure {
+ it.addInput(project.name, oldApiTxt)
+ }
}
val newApiTxtProvider = getNewApiTxt(project, generateApi)
- aggregateNewApiTxtsTask.inputs.file(newApiTxtProvider.file)
- aggregateNewApiTxtsTask.addInput(project.name, newApiTxtProvider.file)
- if (newApiTxtProvider.task != null) {
- aggregateNewApiTxtsTask.dependsOn(newApiTxtProvider.task)
+ aggregateNewApiTxtsTask.configure {
+ it.inputs.file(newApiTxtProvider.file)
+ it.addInput(project.name, newApiTxtProvider.file.get())
}
val newApiTask = createNewApiXmlTask(project, generateApi, doclavaConfiguration)
@@ -131,33 +145,36 @@
private fun createGenerateLocalDiffsTask(
project: Project,
- oldApiTask: ApiXmlConversionTask,
- newApiTask: ApiXmlConversionTask,
+ oldApiTask: TaskProvider<ApiXmlConversionTask>,
+ newApiTask: TaskProvider<ApiXmlConversionTask>,
jdiffConfig: Configuration
-): JDiffTask =
- project.tasks.createWithConfig("generateLocalDiffs", JDiffTask::class.java) {
- // Base classpath is Android SDK, sub-projects add their own.
- classpath = androidJarFile(project)
+): TaskProvider<JDiffTask> =
+ project.tasks.register("generateLocalDiffs", JDiffTask::class.java) {
+ it.apply {
+ // Base classpath is Android SDK, sub-projects add their own.
+ classpath = androidJarFile(project)
- // JDiff properties.
- oldApiXmlFile = oldApiTask.outputApiXmlFile
- newApiXmlFile = newApiTask.outputApiXmlFile
+ // JDiff properties.
+ oldApiXmlFile = oldApiTask.get().outputApiXmlFile
+ newApiXmlFile = newApiTask.get().outputApiXmlFile
- val newApi = project.processProperty("toApi") ?: project.version
- val docsDir = project.rootProject.docsDir()
+ val newApi = project.processProperty("toApi") ?: project.version
+ val docsDir = project.rootProject.docsDir()
- newJavadocPrefix = "../../../../../reference/"
- destinationDir = File(docsDir, "online/sdk/support_api_diff/${project.name}/$newApi")
- // Javadoc properties.
- docletpath = jdiffConfig.resolve()
- title = "AndroidX Library API Differences Report"
+ newJavadocPrefix = "../../../../../reference/"
+ destinationDir = File(docsDir,
+ "online/sdk/support_api_diff/${project.name}/$newApi")
+ // Javadoc properties.
+ docletpath = jdiffConfig.resolve()
+ title = "AndroidX Library API Differences Report"
- exclude("**/BuildConfig.java", "**/R.java")
- dependsOn(oldApiTask, newApiTask, jdiffConfig)
- doFirst {
- println("Generating diffs from api version " +
- "${stripExtension(oldApiTask.outputApiXmlFile.name)} " +
- "to api version $newApi")
+ exclude("**/BuildConfig.java", "**/R.java")
+ dependsOn(oldApiTask, newApiTask, jdiffConfig)
+ doFirst {
+ println("Generating diffs from api version " +
+ "${stripExtension(oldApiTask.get().outputApiXmlFile.name)} " +
+ "to api version $newApi")
+ }
}
}
@@ -167,23 +184,25 @@
* for use by JDiff.
*/
private fun createOldApiXml(project: Project, doclavaConfig: Configuration) =
- project.tasks.createWithConfig("oldApiXml", ApiXmlConversionTask::class.java) {
- val fromApi = project.processProperty("fromApi")
- classpath = project.files(doclavaConfig.resolve())
- val rootFolder = project.projectDir
- inputApiFile = if (fromApi != null) {
- // Use an explicit API file.
- File(rootFolder, "api/$fromApi.txt")
- } else {
- // Use the most recently released API file.
- getLastReleasedApiFile(rootFolder, Version(project.processProperty("toApi")
+ project.tasks.register("oldApiXml", ApiXmlConversionTask::class.java) {
+ it.apply {
+ val fromApi = project.processProperty("fromApi")
+ classpath = project.files(doclavaConfig.resolve())
+ val rootFolder = project.projectDir
+ inputApiFile = if (fromApi != null) {
+ // Use an explicit API file.
+ File(rootFolder, "api/$fromApi.txt")
+ } else {
+ // Use the most recently released API file.
+ getLastReleasedApiFile(rootFolder, Version(project.processProperty("toApi")
?: project.version.toString()), false, false)
- }
+ }
- outputApiXmlFile = File(project.docsDir(),
+ outputApiXmlFile = File(project.docsDir(),
"release/${stripExtension(inputApiFile?.name ?: "creation")}.xml")
- dependsOn(doclavaConfig)
+ dependsOn(doclavaConfig)
+ }
}
/**
@@ -192,24 +211,26 @@
*/
private fun createNewApiXmlTask(
project: Project,
- generateApi: DoclavaTask,
+ generateApi: TaskProvider<DoclavaTask>,
doclavaConfig: Configuration
) =
- project.tasks.createWithConfig("newApiXml", ApiXmlConversionTask::class.java) {
- classpath = project.files(doclavaConfig.resolve())
- val toApi = project.processProperty("toApi")
+ project.tasks.register("newApiXml", ApiXmlConversionTask::class.java) {
+ it.apply {
+ classpath = project.files(doclavaConfig.resolve())
+ val toApi = project.processProperty("toApi")
- if (toApi != null && toApi != project.version) {
- // Use an explicit API file.
- inputApiFile = File(project.projectDir, "api/$toApi.txt")
- } else {
- // Use the current API file (e.g. current.txt).
- inputApiFile = generateApi.apiFile!!
- dependsOn(generateApi, doclavaConfig)
- }
- // Use either the toApi version, otherwise the most recent version.
- outputApiXmlFile = File(project.docsDir(),
+ if (toApi != null && toApi != project.version) {
+ // Use an explicit API file.
+ inputApiFile = File(project.projectDir, "api/$toApi.txt")
+ } else {
+ // Use the current API file (e.g. current.txt).
+ inputApiFile = generateApi.get().apiFile!!
+ dependsOn(generateApi, doclavaConfig)
+ }
+ // Use either the toApi version, otherwise the most recent version.
+ outputApiXmlFile = File(project.docsDir(),
"release/${toApi ?: project.version}.xml")
+ }
}
fun Project.hasApiFolder() = File(projectDir, "api").exists()
@@ -240,19 +261,21 @@
// Creates a new task on the project for generating API files
private fun createGenerateApiTask(project: Project, docletpathParam: Collection<File>) =
- project.tasks.createWithConfig("generateApi", DoclavaTask::class.java) {
- setDocletpath(docletpathParam)
- destinationDir = project.docsDir()
- // Base classpath is Android SDK, sub-projects add their own.
- classpath = androidJarFile(project)
- apiFile = File(project.docsDir(), "release/${project.name}/current.txt")
- generateDocs = false
+ project.tasks.register("generateApi", DoclavaTask::class.java) {
+ it.apply {
+ // Base classpath is Android SDK, sub-projects add their own.
+ classpath = androidJarFile(project)
+ apiFile = File(project.docsDir(), "release/${project.name}/current.txt")
+ setDocletpath(docletpathParam)
+ destinationDir = project.docsDir()
+ generateDocs = false
- coreJavadocOptions {
- addBooleanOption("stubsourceonly", true)
+ coreJavadocOptions {
+ addBooleanOption("stubsourceonly", true)
+ }
+
+ exclude("**/R.java")
}
-
- exclude("**/R.java")
}
/**
@@ -267,17 +290,19 @@
* finalized and the file already exists
* </ul>
*/
-private fun createUpdateApiTask(project: Project, checkApiRelease: CheckApiTask) =
- project.tasks.createWithConfig("updateApi", UpdateApiTask::class.java) {
- group = JavaBasePlugin.VERIFICATION_GROUP
- description = "Updates the candidate API file to incorporate valid changes."
- newApiFile = checkApiRelease.newApiFile
- oldApiFile = project.getCurrentApiFile()
- whitelistErrors = checkApiRelease.whitelistErrors
- whitelistErrorsFile = checkApiRelease.whitelistErrorsFile
- doFirst {
- // Replace the expected whitelist with the detected whitelist.
- whitelistErrors = checkApiRelease.detectedWhitelistErrors
+private fun createUpdateApiTask(project: Project, checkApiRelease: TaskProvider<CheckApiTask>) =
+ project.tasks.register("updateApi", UpdateApiTask::class.java) {
+ it.apply {
+ group = JavaBasePlugin.VERIFICATION_GROUP
+ description = "Updates the candidate API file to incorporate valid changes."
+ newApiFile = checkApiRelease.get().newApiFile
+ oldApiFile = project.getCurrentApiFile()
+ whitelistErrors = checkApiRelease.get().whitelistErrors
+ whitelistErrorsFile = checkApiRelease.get().whitelistErrorsFile
+ doFirst {
+ // Replace the expected whitelist with the detected whitelist.
+ whitelistErrors = checkApiRelease.get().detectedWhitelistErrors
+ }
}
}
@@ -401,32 +426,38 @@
docletpath: Collection<File>,
config: ChecksConfig,
oldApi: File?,
- newApi: File,
+ newApi: Provider<File>,
whitelist: File? = null
) =
- project.tasks.createWithConfig(taskName, CheckApiTask::class.java) {
- doclavaClasspath = docletpath
- checksConfig = config
- newApiFile = newApi
- oldApiFile = oldApi
- whitelistErrorsFile = whitelist
- doFirst {
- logger.lifecycle("Verifying ${newApi.name} " +
- "against ${oldApi?.name ?: "nothing"}...")
+ project.tasks.register(taskName, CheckApiTask::class.java) {
+ it.apply {
+ doclavaClasspath = docletpath
+ checksConfig = config
+ newApiFile = newApi.get()
+ oldApiFile = oldApi
+ whitelistErrorsFile = whitelist
+ doFirst {
+ logger.lifecycle("Verifying ${newApi.get().name} " +
+ "against ${oldApi?.name ?: "nothing"}...")
+ }
}
}
-private fun getNewApiTxt(project: Project, generateApi: DoclavaTask): FileProvider {
+private fun getNewApiTxt(project: Project, generateApi: TaskProvider<DoclavaTask>): FileProvider {
val toApi = project.processProperty("toApi")
return if (toApi != null) {
// Use an explicit API file.
- FileProvider(File(project.projectDir, "api/$toApi.txt"), null)
+ FileProvider(project.provider {
+ File(project.projectDir, "api/$toApi.txt")
+ }, null)
} else {
// Use the current API file (e.g. current.txt).
- FileProvider(generateApi.apiFile!!, generateApi)
+ FileProvider(generateApi.map {
+ it.apiFile!!
+ }, generateApi)
}
}
-private data class FileProvider(val file: File, val task: Task?)
+private data class FileProvider(val file: Provider<File>, val task: TaskProvider<*>?)
private fun stripExtension(fileName: String) = fileName.substringBeforeLast('.')
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index 2139244..d43bbf3 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -27,11 +27,11 @@
const val DEXMAKER_MOCKITO = "com.linkedin.dexmaker:dexmaker-mockito:2.19.0"
const val ESPRESSO_CONTRIB = "androidx.test.espresso:espresso-contrib:3.1.0"
const val ESPRESSO_CORE = "androidx.test.espresso:espresso-core:3.1.0"
-const val FINDBUGS = "com.google.code.findbugs:jsr305:2.0.1"
+const val FINDBUGS = "com.google.code.findbugs:jsr305:3.0.2"
const val GOOGLE_COMPILE_TESTING = "com.google.testing.compile:compile-testing:0.11"
const val GSON = "com.google.code.gson:gson:2.8.0"
-const val GUAVA = "com.google.guava:guava:23.5-jre"
-const val GUAVA_ANDROID = "com.google.guava:guava:23.6-android"
+const val GUAVA = "com.google.guava:guava:27.0.1-jre"
+const val GUAVA_ANDROID = "com.google.guava:guava:27.0.1-android"
const val GUAVA_LISTENABLE_FUTURE = "com.google.guava:listenablefuture:1.0"
const val INTELLIJ_ANNOTATIONS = "com.intellij:annotations:12.0"
const val JAVAPOET = "com.squareup:javapoet:1.8.0"
diff --git a/buildSrc/src/main/kotlin/androidx/build/doclava/ChecksConfig.kt b/buildSrc/src/main/kotlin/androidx/build/doclava/ChecksConfig.kt
index 9de15ee..7e6e2be 100644
--- a/buildSrc/src/main/kotlin/androidx/build/doclava/ChecksConfig.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/doclava/ChecksConfig.kt
@@ -45,7 +45,7 @@
"If you are adding APIs that should be excluded from the public API surface,\n" +
"consider using package or private visibility. If the API must have public\n" +
"visibility, you may exclude it from public API by using the @hide javadoc\n" +
- "annotation paired with the @RestrictTo(LIBRARY_GROUP) code annotation."
+ "annotation paired with the @RestrictTo(LIBRARY_GROUP_PREFIX) code annotation."
val CHECK_API_CONFIG_RELEASE = ChecksConfig(
onFailMessage =
diff --git a/buildSrc/src/main/kotlin/androidx/build/docs/ConcatenateFilesTask.kt b/buildSrc/src/main/kotlin/androidx/build/docs/ConcatenateFilesTask.kt
index d97c701..c07ea89 100644
--- a/buildSrc/src/main/kotlin/androidx/build/docs/ConcatenateFilesTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/docs/ConcatenateFilesTask.kt
@@ -16,12 +16,10 @@
package androidx.build.docs
-import org.gradle.api.Action
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.OutputFile
import java.io.File
-import java.util.SortedMap
open class ConcatenateFilesTask : DefaultTask() {
private var keyedInputs: MutableMap<String, File> = mutableMapOf()
diff --git a/buildSrc/src/main/kotlin/androidx/build/gmaven/GMavenVersionChecker.kt b/buildSrc/src/main/kotlin/androidx/build/gmaven/GMavenVersionChecker.kt
index 482d114..3a16d3f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/gmaven/GMavenVersionChecker.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/gmaven/GMavenVersionChecker.kt
@@ -130,8 +130,8 @@
* @param artifacts Map of artifact versions keyed by artifact name
*/
private data class GroupVersionData(
- val name: String,
- val artifacts: Map<String, ArtifactVersionData>
+ val name: String,
+ val artifacts: Map<String, ArtifactVersionData>
) {
companion object {
/**
diff --git a/buildSrc/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt b/buildSrc/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt
index b9d9738..8430936 100644
--- a/buildSrc/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt
@@ -22,7 +22,6 @@
import org.gradle.api.attributes.Attribute
import org.gradle.api.file.FileCollection
import org.gradle.api.Project
-import org.gradle.api.Task
import org.gradle.api.tasks.SourceSet
import java.io.File
@@ -63,4 +62,3 @@
}
}
}
-
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiCompatibilityTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiCompatibilityTask.kt
index e9691fe5..2a18fb9 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiCompatibilityTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiCompatibilityTask.kt
@@ -18,10 +18,6 @@
import androidx.build.checkapi.ApiLocation
import androidx.build.checkapi.ApiViolationExclusions
-import com.android.build.gradle.BaseExtension
-import com.android.build.gradle.api.BaseVariant
-import org.gradle.api.attributes.Attribute
-import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.TaskAction
@@ -64,7 +60,6 @@
}
}
-
// Confirms that the public API of this library (or the restricted API, if <checkRestrictedAPIs> is set
// is compatible with <apiFile> except for any exclusions listed in <exclusionsFile>
fun checkApiFile(apiFile: File, exclusionsFile: File, checkRestrictedAPIs: Boolean) {
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt
index bfb7f79..474d6d5 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/CheckApiEquivalenceTask.kt
@@ -17,14 +17,9 @@
package androidx.build.metalava
import androidx.build.checkapi.ApiLocation
-import com.android.build.gradle.BaseExtension
-import com.android.build.gradle.api.BaseVariant
import org.apache.commons.io.FileUtils
-import org.gradle.api.attributes.Attribute
import org.gradle.api.DefaultTask
-import org.gradle.api.file.FileCollection
import org.gradle.api.GradleException
-import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.TaskAction
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/GenerateApiTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/GenerateApiTask.kt
index 7302a39..bfb0063 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/GenerateApiTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/GenerateApiTask.kt
@@ -17,12 +17,6 @@
package androidx.build.metalava
import androidx.build.checkapi.ApiLocation
-import com.android.build.gradle.BaseExtension
-import com.android.build.gradle.api.BaseVariant
-import com.google.common.io.Files
-import org.gradle.api.attributes.Attribute
-import org.gradle.api.file.FileCollection
-import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.TaskAction
import java.io.File
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/IgnoreApiChangesTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/IgnoreApiChangesTask.kt
index 4e24c6d..5181a85 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/IgnoreApiChangesTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/IgnoreApiChangesTask.kt
@@ -41,15 +41,18 @@
@InputFiles
fun getTaskInputs(): List<File> {
if (processRestrictedAPIs) {
- return referenceApi!!.files() + exclusions!!.files()
+ return referenceApi!!.files()
}
- return listOf(referenceApi!!.publicApiFile, exclusions!!.publicApiFile)
+ return listOf(referenceApi!!.publicApiFile)
}
// Declaring outputs prevents Gradle from rerunning this task if the inputs haven't changed
@OutputFiles
fun getTaskOutputs(): List<File>? {
- return getTaskInputs()
+ if (processRestrictedAPIs) {
+ return exclusions!!.files()
+ }
+ return listOf(exclusions!!.publicApiFile)
}
@TaskAction
@@ -61,7 +64,7 @@
updateExclusions(referenceApi.publicApiFile, exclusions.publicApiFile, false)
if (processRestrictedAPIs) {
- updateExclusions(referenceApi.restrictedApiFile, exclusions.restrictedApiFile, false)
+ updateExclusions(referenceApi.restrictedApiFile, exclusions.restrictedApiFile, true)
}
}
@@ -95,6 +98,10 @@
if (intermediateExclusionsFile.length() > 0) {
Files.copy(intermediateExclusionsFile, exclusionsFile)
+ } else {
+ if (exclusionsFile.exists()) {
+ exclusionsFile.delete()
+ }
}
}
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt
index db9457c..69a7259 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/UpdateApiTask.kt
@@ -17,13 +17,9 @@
package androidx.build.metalava
import androidx.build.checkapi.ApiLocation
-import com.android.build.gradle.BaseExtension
-import com.android.build.gradle.api.BaseVariant
import com.google.common.io.Files
-import org.gradle.api.attributes.Attribute
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
-import org.gradle.api.file.FileCollection
import org.gradle.api.logging.Logger
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFiles
@@ -90,6 +86,6 @@
}
Files.copy(source, dest)
- logger.lifecycle("Copied ${source} to ${dest}")
+ logger.lifecycle("Copied $source to $dest")
}
}
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Common.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Common.java
index 8c83496..0204504 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Common.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Common.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -31,7 +31,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
final class Common {
/**
* This is a utility class
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Destination.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Destination.java
index 77ee63b..8ddceb6 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Destination.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Destination.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -66,14 +66,14 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Destination() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Destination(@NonNull String title, @NonNull String address, @Nullable Distance distance,
@Nullable Time eta, @Nullable LatLng latlng, @Nullable EnumWrapper<Traffic> traffic) {
mTitle = title;
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Distance.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Distance.java
index 2c226ce..24d75d1 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Distance.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Distance.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
@@ -62,7 +62,7 @@
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Distance() {
}
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/EnumWrapper.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/EnumWrapper.java
index a865983..2957988 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/EnumWrapper.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/EnumWrapper.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -40,7 +40,7 @@
* @param <T> Enum type to be wrapped.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@VersionedParcelize
final class EnumWrapper<T extends Enum<T>> implements VersionedParcelable {
@ParcelField(1)
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/ImageReference.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/ImageReference.java
index 9e2ede7..a4a81cb 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/ImageReference.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/ImageReference.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.net.Uri;
@@ -79,14 +79,14 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
ImageReference() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
ImageReference(@NonNull String contentUri,
@IntRange(from = 1, to = Integer.MAX_VALUE) int originalWidth,
@IntRange(from = 1, to = Integer.MAX_VALUE) int originalHeight,
@@ -178,7 +178,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
public String getRawContentUri() {
String value = Common.nonNullOrEmpty(mContentUri);
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Lane.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Lane.java
index 6d7e734..e7c410d 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Lane.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Lane.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
@@ -44,14 +44,14 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Lane() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Lane(@NonNull List<LaneDirection> directions) {
mDirections = new ArrayList<>(directions);
}
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/LaneDirection.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/LaneDirection.java
index 94c2976..f7ef806 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/LaneDirection.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/LaneDirection.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
@@ -91,14 +91,14 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
LaneDirection() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
LaneDirection(@NonNull EnumWrapper<Shape> shape, boolean highlighted) {
mShape = shape;
mHighlighted = highlighted;
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/LatLng.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/LatLng.java
index 0c1231e..4371ca4 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/LatLng.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/LatLng.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.location.Location;
@@ -47,7 +47,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
LatLng() {
}
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Maneuver.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Maneuver.java
index c607ab2..42e2bf8 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Maneuver.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Maneuver.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
@@ -295,14 +295,14 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Maneuver() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Maneuver(@NonNull EnumWrapper<Type> type, int roundaboutExitNumber,
@Nullable ImageReference icon) {
mType = type;
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/NavigationState.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/NavigationState.java
index 93f3888..41fa789 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/NavigationState.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/NavigationState.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Parcel;
import android.os.Parcelable;
@@ -74,14 +74,14 @@
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
NavigationState() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
NavigationState(@NonNull List<Step> steps,
@NonNull List<Destination> destinations,
@Nullable Segment currentSegment,
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/RichText.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/RichText.java
index f5a2110..60c31c7 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/RichText.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/RichText.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
@@ -43,14 +43,14 @@
* Used by {@link VersionedParcelable}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
RichText() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
RichText(@NonNull List<RichTextElement> elements) {
mElements = new ArrayList<>(elements);
}
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/RichTextElement.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/RichTextElement.java
index 7f7bbc7..96cb264 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/RichTextElement.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/RichTextElement.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -51,14 +51,14 @@
* Used by {@link VersionedParcelable}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
RichTextElement() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RichTextElement(@NonNull String text, @Nullable ImageReference image) {
mText = Preconditions.checkNotNull(text, "A textual representation of this "
+ "element must be provided.");
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Segment.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Segment.java
index 555ec80..c600b14 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Segment.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Segment.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
@@ -39,7 +39,7 @@
* Used by {@link VersionedParcelable}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Segment() {
}
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Step.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Step.java
index 096f29d..95704ec 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Step.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Step.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -53,14 +53,14 @@
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Step() {
}
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Step(@Nullable Distance distance, @Nullable Maneuver maneuver, @NonNull List<Lane> lanes,
@Nullable ImageReference lanesImage, @Nullable RichText cue) {
mDistance = distance;
diff --git a/car/cluster/src/main/java/androidx/car/cluster/navigation/Time.java b/car/cluster/src/main/java/androidx/car/cluster/navigation/Time.java
index 5bc7589..44368b8 100644
--- a/car/cluster/src/main/java/androidx/car/cluster/navigation/Time.java
+++ b/car/cluster/src/main/java/androidx/car/cluster/navigation/Time.java
@@ -16,7 +16,7 @@
package androidx.car.cluster.navigation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
@@ -38,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@VersionedParcelize
final class Time implements VersionedParcelable {
@ParcelField(1)
@@ -51,7 +51,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Time() {
}
diff --git a/car/core/api/1.0.0-alpha6.txt b/car/core/api/1.0.0-alpha6.txt
index 65258a0..a192354 100644
--- a/car/core/api/1.0.0-alpha6.txt
+++ b/car/core/api/1.0.0-alpha6.txt
@@ -554,6 +554,38 @@
method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
}
+ public class SwitchListItem extends androidx.car.widget.ListItem<androidx.car.widget.SwitchListItem.ViewHolder> {
+ ctor public SwitchListItem(android.content.Context);
+ method public static androidx.car.widget.SwitchListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected final android.content.Context getContext();
+ method public int getViewType();
+ method public void onBind(androidx.car.widget.SwitchListItem.ViewHolder!);
+ method @CallSuper protected void resolveDirtyState();
+ method public void setBody(CharSequence?);
+ method public void setClickable(boolean);
+ method public void setEnabled(boolean);
+ method public void setPrimaryActionEmptyIcon();
+ method public void setPrimaryActionIcon(android.graphics.drawable.Icon, int);
+ method public void setPrimaryActionNoIcon();
+ method public void setShowSwitchDivider(boolean);
+ method public void setSwitchOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener?);
+ method public void setSwitchState(boolean);
+ method public void setTitle(CharSequence?);
+ field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
+ field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
+ field public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0; // 0x0
+ }
+
+ public static final class SwitchListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public SwitchListItem.ViewHolder(android.view.View);
+ method public android.widget.TextView getBody();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.Switch getSwitch();
+ method public android.view.View getSwitchDivider();
+ method public android.widget.TextView getTitle();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
public class TextListItem extends androidx.car.widget.ListItem<androidx.car.widget.TextListItem.ViewHolder> {
ctor public TextListItem(android.content.Context);
method public static androidx.car.widget.TextListItem.ViewHolder createViewHolder(android.view.View!);
@@ -575,8 +607,8 @@
method @Deprecated public void setSupplementalIcon(int, boolean, android.view.View.OnClickListener!);
method @Deprecated public void setSupplementalIcon(android.graphics.drawable.Drawable!, boolean, android.view.View.OnClickListener!);
method public void setSupplementalIconOnClickListener(android.view.View.OnClickListener);
- method public void setSwitch(boolean, boolean, android.widget.CompoundButton.OnCheckedChangeListener!);
- method public void setSwitchState(boolean);
+ method @Deprecated public void setSwitch(boolean, boolean, android.widget.CompoundButton.OnCheckedChangeListener!);
+ method @Deprecated public void setSwitchState(boolean);
method public void setTitle(CharSequence!);
field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
diff --git a/car/core/api/1.0.0-alpha7.txt b/car/core/api/1.0.0-alpha7.txt
new file mode 100644
index 0000000..a192354
--- /dev/null
+++ b/car/core/api/1.0.0-alpha7.txt
@@ -0,0 +1,632 @@
+// Signature format: 3.0
+package androidx.car.app {
+
+ public class CarAlertDialog extends android.app.Dialog {
+ }
+
+ public static final class CarAlertDialog.Builder {
+ ctor public CarAlertDialog.Builder(android.content.Context!);
+ method public androidx.car.app.CarAlertDialog! create();
+ method public androidx.car.app.CarAlertDialog.Builder! setBody(@StringRes int);
+ method public androidx.car.app.CarAlertDialog.Builder! setBody(CharSequence!);
+ method public androidx.car.app.CarAlertDialog.Builder! setBodyMovementMethod(android.text.method.MovementMethod?);
+ method public androidx.car.app.CarAlertDialog.Builder! setCancelable(boolean);
+ method public androidx.car.app.CarAlertDialog.Builder setHeaderIcon(@DrawableRes int);
+ method public androidx.car.app.CarAlertDialog.Builder setHeaderIcon(android.graphics.drawable.Icon?);
+ method public androidx.car.app.CarAlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener?);
+ method public androidx.car.app.CarAlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener?);
+ method public androidx.car.app.CarAlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.car.app.CarAlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.car.app.CarAlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener?);
+ method public androidx.car.app.CarAlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener?);
+ method public androidx.car.app.CarAlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.car.app.CarAlertDialog.Builder! setTitle(CharSequence!);
+ }
+
+ public class CarListDialog extends android.app.Dialog {
+ }
+
+ public static final class CarListDialog.Builder {
+ ctor public CarListDialog.Builder(android.content.Context!);
+ method public androidx.car.app.CarListDialog! create();
+ method public androidx.car.app.CarListDialog.Builder setCancelable(boolean);
+ method public androidx.car.app.CarListDialog.Builder setInitialPosition(int);
+ method public androidx.car.app.CarListDialog.Builder setItems(CharSequence[], android.content.DialogInterface.OnClickListener?);
+ method public androidx.car.app.CarListDialog.Builder setItems(androidx.car.app.CarListDialog.DialogSubSection[], android.content.DialogInterface.OnClickListener?);
+ method public androidx.car.app.CarListDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.car.app.CarListDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.car.app.CarListDialog.Builder setTitle(@StringRes int);
+ method public androidx.car.app.CarListDialog.Builder setTitle(CharSequence!);
+ }
+
+ public static class CarListDialog.DialogSubSection {
+ ctor public CarListDialog.DialogSubSection(CharSequence, CharSequence[]);
+ method public int getItemCount();
+ method public CharSequence[] getItems();
+ method public CharSequence getTitle();
+ }
+
+}
+
+package androidx.car.drawer {
+
+ public abstract class CarDrawerAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.car.drawer.DrawerItemViewHolder> implements androidx.car.widget.PagedListView.ItemCap {
+ ctor protected CarDrawerAdapter(android.content.Context!, boolean);
+ method public void cleanup();
+ method protected abstract int getActualItemCount();
+ method public final int getItemCount();
+ method public final int getItemViewType(int);
+ method public final void onBindViewHolder(androidx.car.drawer.DrawerItemViewHolder!, int);
+ method public final androidx.car.drawer.DrawerItemViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
+ method protected abstract void populateViewHolder(androidx.car.drawer.DrawerItemViewHolder!, int);
+ method public final void setMaxItems(int);
+ method public final void setTitle(CharSequence?);
+ method public void start();
+ method public void stop();
+ method protected boolean usesSmallLayout(int);
+ }
+
+ public class CarDrawerController {
+ ctor public CarDrawerController(androidx.drawerlayout.widget.DrawerLayout, androidx.appcompat.app.ActionBarDrawerToggle);
+ method public void addDrawerListener(androidx.drawerlayout.widget.DrawerLayout.DrawerListener);
+ method public void closeDrawer();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void openDrawer();
+ method public final void pushAdapter(androidx.car.drawer.CarDrawerAdapter!);
+ method public void removeDrawerListener(androidx.drawerlayout.widget.DrawerLayout.DrawerListener);
+ method public void scrollToPosition(int);
+ method public void setRootAdapter(androidx.car.drawer.CarDrawerAdapter?);
+ method public void showLoadingProgressBar(boolean);
+ method public void syncState();
+ }
+
+ public class DrawerItemViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements androidx.car.uxrestrictions.OnUxRestrictionsChangedListener {
+ method public android.widget.TextView? getBodyView();
+ method public android.widget.ImageView? getEndIconView();
+ method public android.widget.ImageView getIconView();
+ method public android.widget.TextView getTitleView();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+}
+
+package androidx.car.util {
+
+ public class CarUxRestrictionsHelper {
+ ctor public CarUxRestrictionsHelper(android.content.Context!, androidx.car.uxrestrictions.OnUxRestrictionsChangedListener);
+ method public void start();
+ method public void stop();
+ }
+
+ public class ColumnCalculator {
+ method public int getColumnCount();
+ method @Px public int getColumnSpanWidth(int);
+ method @Px public int getColumnWidth();
+ method public int getGutterCount();
+ method @Px public int getGutterWidth();
+ method public static androidx.car.util.ColumnCalculator! getInstance(android.content.Context!);
+ }
+
+}
+
+package androidx.car.uxrestrictions {
+
+ public final class CarUxRestrictions {
+ ctor public CarUxRestrictions(androidx.car.uxrestrictions.CarUxRestrictions!);
+ method public int getActiveRestrictions();
+ method public int getMaxContentDepth();
+ method public int getMaxCumulativeContentItems();
+ method public int getMaxRestrictedStringLength();
+ method public long getTimestamp();
+ method public boolean hasSameRestrictionsAs(androidx.car.uxrestrictions.CarUxRestrictions!);
+ method public boolean isDistractionOptimizationRequired();
+ field public static final int UX_RESTRICTIONS_BASELINE = 0; // 0x0
+ field public static final int UX_RESTRICTIONS_FULLY_RESTRICTED = 511; // 0x1ff
+ field public static final int UX_RESTRICTIONS_LIMIT_CONTENT = 32; // 0x20
+ field public static final int UX_RESTRICTIONS_LIMIT_STRING_LENGTH = 4; // 0x4
+ field public static final int UX_RESTRICTIONS_NO_DIALPAD = 1; // 0x1
+ field public static final int UX_RESTRICTIONS_NO_FILTERING = 2; // 0x2
+ field public static final int UX_RESTRICTIONS_NO_KEYBOARD = 8; // 0x8
+ field public static final int UX_RESTRICTIONS_NO_SETUP = 64; // 0x40
+ field public static final int UX_RESTRICTIONS_NO_TEXT_MESSAGE = 128; // 0x80
+ field public static final int UX_RESTRICTIONS_NO_VIDEO = 16; // 0x10
+ field public static final int UX_RESTRICTIONS_NO_VOICE_TRANSCRIPTION = 256; // 0x100
+ }
+
+ public static final class CarUxRestrictions.Builder {
+ ctor public CarUxRestrictions.Builder(boolean, int, long);
+ method public androidx.car.uxrestrictions.CarUxRestrictions build();
+ method public androidx.car.uxrestrictions.CarUxRestrictions.Builder setMaxContentDepth(int);
+ method public androidx.car.uxrestrictions.CarUxRestrictions.Builder setMaxCumulativeContentItems(int);
+ method public androidx.car.uxrestrictions.CarUxRestrictions.Builder setMaxStringLength(int);
+ }
+
+ public interface OnUxRestrictionsChangedListener {
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+}
+
+package androidx.car.widget {
+
+ public final class ActionListItem extends androidx.car.widget.ListItem<androidx.car.widget.ActionListItem.ViewHolder> {
+ ctor public ActionListItem(android.content.Context);
+ method public static androidx.car.widget.ActionListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected android.content.Context getContext();
+ method public int getViewType();
+ method public void onBind(androidx.car.widget.ActionListItem.ViewHolder!);
+ method protected void resolveDirtyState();
+ method @Deprecated public void setAction(String, boolean, android.view.View.OnClickListener);
+ method public void setActionBorderless(boolean);
+ method @Deprecated public void setActions(String, boolean, android.view.View.OnClickListener, String, boolean, android.view.View.OnClickListener);
+ method public void setBody(CharSequence);
+ method public void setEnabled(boolean);
+ method public void setOnClickListener(android.view.View.OnClickListener!);
+ method public void setPrimaryAction(String, boolean, android.view.View.OnClickListener);
+ method public void setPrimaryActionEmptyIcon();
+ method public void setPrimaryActionIcon(@DrawableRes int, int);
+ method public void setPrimaryActionIcon(android.graphics.drawable.Drawable?, int);
+ method public void setPrimaryActionNoIcon();
+ method public void setSecondaryAction(String, boolean, android.view.View.OnClickListener);
+ method public void setTitle(CharSequence);
+ field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
+ field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
+ field public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0; // 0x0
+ }
+
+ public static final class ActionListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public ActionListItem.ViewHolder(android.view.View);
+ method public android.widget.TextView getBody();
+ method public android.widget.Button getPrimaryAction();
+ method public android.view.View getPrimaryActionDivider();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.Button getSecondaryAction();
+ method public android.view.View getSecondaryActionDivider();
+ method public android.widget.TextView getTitle();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions);
+ method public void setActionBorderless(boolean);
+ }
+
+ public interface AlphaJumpAdapter {
+ method public java.util.List<androidx.car.widget.AlphaJumpBucket>! getAlphaJumpBuckets();
+ method public void onAlphaJumpEnter();
+ method public void onAlphaJumpLeave(androidx.car.widget.AlphaJumpBucket!);
+ }
+
+ public interface AlphaJumpBucket {
+ method public int getIndex();
+ method public CharSequence! getLabel();
+ method public boolean isEmpty();
+ }
+
+ public class AlphaJumpBucketer {
+ ctor public AlphaJumpBucketer();
+ ctor public AlphaJumpBucketer(androidx.car.widget.AlphaJumpBucketer.Bucket[]!);
+ method public java.util.List<androidx.car.widget.AlphaJumpBucket>! createBuckets(String[]!);
+ method public java.util.List<androidx.car.widget.AlphaJumpBucket>! createBuckets(Iterable<java.lang.String>!);
+ method public java.util.List<androidx.car.widget.AlphaJumpBucket>! createBuckets(java.util.Iterator<java.lang.String>!);
+ }
+
+ public static class AlphaJumpBucketer.Bucket implements androidx.car.widget.AlphaJumpBucket {
+ method public int getIndex();
+ method public CharSequence! getLabel();
+ method public boolean isEmpty();
+ }
+
+ public class AlphaJumpOverlayView extends androidx.gridlayout.widget.GridLayout {
+ ctor public AlphaJumpOverlayView(android.content.Context);
+ method public void hide();
+ method public void show();
+ }
+
+ public class CarMenuItem {
+ method public androidx.car.widget.CarMenuItem.DisplayBehavior getDisplayBehavior();
+ method public android.graphics.drawable.Icon? getIcon();
+ method public androidx.car.widget.CarMenuItem.OnClickListener? getOnClickListener();
+ method @StyleRes public int getStyleResId();
+ method public CharSequence? getTitle();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public void setChecked(boolean);
+ method public void setEnabled(boolean);
+ method public void setTitle(CharSequence?);
+ }
+
+ public static final class CarMenuItem.Builder {
+ ctor public CarMenuItem.Builder();
+ method public androidx.car.widget.CarMenuItem build();
+ method public androidx.car.widget.CarMenuItem.Builder setCheckable(boolean);
+ method public androidx.car.widget.CarMenuItem.Builder setChecked(boolean);
+ method public androidx.car.widget.CarMenuItem.Builder setDisplayBehavior(androidx.car.widget.CarMenuItem.DisplayBehavior);
+ method public androidx.car.widget.CarMenuItem.Builder setEnabled(boolean);
+ method public androidx.car.widget.CarMenuItem.Builder setIcon(android.graphics.drawable.Icon);
+ method public androidx.car.widget.CarMenuItem.Builder setOnClickListener(androidx.car.widget.CarMenuItem.OnClickListener);
+ method public androidx.car.widget.CarMenuItem.Builder setStyle(@StyleRes int);
+ method public androidx.car.widget.CarMenuItem.Builder setTitle(CharSequence);
+ }
+
+ public enum CarMenuItem.DisplayBehavior {
+ enum_constant public static final androidx.car.widget.CarMenuItem.DisplayBehavior ALWAYS;
+ enum_constant public static final androidx.car.widget.CarMenuItem.DisplayBehavior IF_ROOM;
+ enum_constant public static final androidx.car.widget.CarMenuItem.DisplayBehavior NEVER;
+ }
+
+ public static interface CarMenuItem.OnClickListener {
+ method public void onClick(androidx.car.widget.CarMenuItem!);
+ }
+
+ public class CarToolbar extends android.view.ViewGroup {
+ ctor public CarToolbar(android.content.Context!);
+ ctor public CarToolbar(android.content.Context!, android.util.AttributeSet!);
+ ctor public CarToolbar(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public CarToolbar(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public java.util.List<androidx.car.widget.CarMenuItem>? getMenuItems();
+ method public CharSequence? getSubtitle();
+ method public CharSequence! getTitle();
+ method public void hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void setMenuItems(java.util.List<androidx.car.widget.CarMenuItem>?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationIconContainerWidth(@Px int);
+ method public void setNavigationIconOnClickListener(android.view.View.OnClickListener?);
+ method public void setNavigationIconTint(@ColorInt int);
+ method public void setNavigationIconTint(android.graphics.ColorFilter?);
+ method public void setOverflowIcon(@DrawableRes int);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence?);
+ method public void setSubtitleTextAppearance(@StyleRes int);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleIcon(@DrawableRes int);
+ method public void setTitleIcon(android.graphics.drawable.Drawable?);
+ method public void setTitleIconEndMargin(@Px int);
+ method public void setTitleIconSize(@Px int);
+ method public void setTitleIconStartMargin(@Px int);
+ method public void setTitleTextAppearance(@StyleRes int);
+ method public void showOverflowMenu();
+ }
+
+ public final class ColumnCardView extends androidx.cardview.widget.CardView {
+ ctor public ColumnCardView(android.content.Context!);
+ ctor public ColumnCardView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ColumnCardView(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getColumnSpan();
+ method public void onMeasure(int, int);
+ method public void setColumnSpan(int);
+ }
+
+ public abstract class ListItem<VH extends androidx.car.widget.ListItem.ViewHolder> {
+ ctor public ListItem();
+ method public final void addViewBinder(androidx.car.widget.ListItem.ViewBinder<VH>!);
+ method public final void addViewBinder(androidx.car.widget.ListItem.ViewBinder<VH>!, androidx.car.widget.ListItem.ViewBinder<VH>?);
+ method public boolean getShowDivider();
+ method public abstract int getViewType();
+ method protected boolean isDirty();
+ method protected void markClean();
+ method protected void markDirty();
+ method protected abstract void onBind(VH!);
+ method public boolean removeViewBinder(androidx.car.widget.ListItem.ViewBinder<VH>!);
+ method protected abstract void resolveDirtyState();
+ method public abstract void setEnabled(boolean);
+ method public void setShowDivider(boolean);
+ }
+
+ public static interface ListItem.ViewBinder<VH> {
+ method public void bind(VH!);
+ }
+
+ public abstract static class ListItem.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements androidx.car.uxrestrictions.OnUxRestrictionsChangedListener {
+ ctor public ListItem.ViewHolder(android.view.View!);
+ method public final void addCleanUp(androidx.car.widget.ListItem.ViewBinder<androidx.car.widget.ListItem.ViewHolder>?);
+ method public final void cleanUp();
+ }
+
+ public class ListItemAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.car.widget.ListItem.ViewHolder> implements androidx.car.widget.PagedListView.DividerVisibilityManager androidx.car.widget.PagedListView.ItemCap {
+ ctor public ListItemAdapter(android.content.Context, androidx.car.widget.ListItemProvider);
+ ctor public ListItemAdapter(android.content.Context, androidx.car.widget.ListItemProvider, int);
+ method public android.content.Context getContext();
+ method public int getItemCount();
+ method public boolean getShowDivider(@IntRange(from=0) int);
+ method public void onBindViewHolder(androidx.car.widget.ListItem.ViewHolder!, int);
+ method public androidx.car.widget.ListItem.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
+ method public void registerListItemViewType(@IntRange(from=java.lang.Integer.MIN_VALUE, to=0xffffffff) int, @LayoutRes int, java.util.function.Function<android.view.View,androidx.car.widget.ListItem.ViewHolder>!);
+ method public void setMaxItems(int);
+ method public void start();
+ method public void stop();
+ }
+
+ public static final class ListItemAdapter.BackgroundStyle {
+ field public static final int CARD = 2; // 0x2
+ field public static final int NONE = 1; // 0x1
+ field public static final int PANEL = 3; // 0x3
+ field public static final int SOLID = 0; // 0x0
+ }
+
+ public abstract class ListItemProvider<VH extends androidx.car.widget.ListItem.ViewHolder> {
+ ctor public ListItemProvider();
+ method public abstract androidx.car.widget.ListItem<VH> get(int);
+ method public abstract int size();
+ }
+
+ public static class ListItemProvider.ListProvider<VH extends androidx.car.widget.ListItem.ViewHolder> extends androidx.car.widget.ListItemProvider {
+ ctor public ListItemProvider.ListProvider(java.util.List<androidx.car.widget.ListItem<VH>>);
+ method public androidx.car.widget.ListItem<VH> get(int);
+ method public int size();
+ }
+
+ public class PagedListView extends android.widget.FrameLayout {
+ ctor public PagedListView(android.content.Context!);
+ ctor public PagedListView(android.content.Context!, android.util.AttributeSet!);
+ ctor public PagedListView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public PagedListView(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+ method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+ method public androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>? getAdapter();
+ method public int getListContentBottomOffset();
+ method public int getListContentTopOffset();
+ method public int getMaxPages();
+ method public int getPage(int);
+ method public androidx.recyclerview.widget.RecyclerView getRecyclerView();
+ method public int getRowsPerPage();
+ method public void hideAlphaJump();
+ method public boolean isAlphaJumpShown();
+ method public boolean isAtEnd();
+ method public boolean isAtStart();
+ method public boolean isScrollbarThumbEnabled();
+ method public void onLayout(boolean, int, int, int, int);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public void pageDown();
+ method public void pageUp();
+ method public int positionOf(android.view.View?);
+ method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+ method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+ method public void scrollToPosition(int);
+ method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter<? extends androidx.recyclerview.widget.RecyclerView.ViewHolder>);
+ method public void setDividerColor(@ColorRes int);
+ method public void setDividerVisibilityManager(androidx.car.widget.PagedListView.DividerVisibilityManager!);
+ method public void setDownButtonIcon(android.graphics.drawable.Drawable!);
+ method public void setGutter(@androidx.car.widget.PagedListView.Gutter int);
+ method public void setGutterSize(int);
+ method public void setItemSpacing(int);
+ method public void setListContentBottomOffset(@Px int);
+ method public void setListContentTopOffset(@Px int);
+ method public void setMaxPages(int);
+ method public void setOnScrollListener(androidx.car.widget.PagedListView.OnScrollListener!);
+ method public void setScrollBarContainerWidth(int);
+ method public void setScrollBarTopMargin(int);
+ method public void setScrollbarThumbEnabled(boolean);
+ method public void setUpButtonIcon(android.graphics.drawable.Drawable!);
+ method public void showAlphaJump();
+ method public void snapToPosition(int);
+ field public static final int UNLIMITED_PAGES = -1; // 0xffffffff
+ }
+
+ public static interface PagedListView.DividerVisibilityManager {
+ method public boolean getShowDivider(int);
+ }
+
+ @IntDef({androidx.car.widget.PagedListView.Gutter.NONE, androidx.car.widget.PagedListView.Gutter.START, androidx.car.widget.PagedListView.Gutter.END, androidx.car.widget.PagedListView.Gutter.BOTH}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PagedListView.Gutter {
+ field public static final int BOTH = 3; // 0x3
+ field public static final int END = 2; // 0x2
+ field public static final int NONE = 0; // 0x0
+ field public static final int START = 1; // 0x1
+ }
+
+ public static interface PagedListView.ItemCap {
+ method public void setMaxItems(int);
+ field public static final int UNLIMITED = -1; // 0xffffffff
+ }
+
+ public static interface PagedListView.ItemPositionOffset {
+ method public void setPositionOffset(int);
+ }
+
+ public abstract static class PagedListView.OnScrollListener {
+ ctor public PagedListView.OnScrollListener();
+ method public void onReachBottom();
+ method public void onScrollDownButtonClicked();
+ method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView!, int);
+ method public void onScrollUpButtonClicked();
+ method public void onScrolled(androidx.recyclerview.widget.RecyclerView!, int, int);
+ }
+
+ public class PagedScrollBarView extends android.view.ViewGroup {
+ ctor public PagedScrollBarView(android.content.Context!);
+ ctor public PagedScrollBarView(android.content.Context!, android.util.AttributeSet!);
+ ctor public PagedScrollBarView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public PagedScrollBarView(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public boolean isDownEnabled();
+ method public boolean isDownPressed();
+ method public boolean isScrollbarThumbEnabled();
+ method public boolean isUpPressed();
+ method public void onLayout(boolean, int, int, int, int);
+ method public void setButtonRippleBackground(@DrawableRes int);
+ method public void setButtonTintColor(@ColorRes int);
+ method public void setDownButtonIcon(android.graphics.drawable.Drawable!);
+ method public void setDownEnabled(boolean);
+ method public void setPaginationListener(androidx.car.widget.PagedScrollBarView.PaginationListener!);
+ method public void setParameters(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+ method public void setScrollbarThumbColor(@ColorRes int);
+ method public void setScrollbarThumbEnabled(boolean);
+ method public void setUpButtonIcon(android.graphics.drawable.Drawable!);
+ method public void setUpEnabled(boolean);
+ }
+
+ public static interface PagedScrollBarView.PaginationListener {
+ method public void onAlphaJump();
+ method public void onPaginate(int);
+ field public static final int PAGE_DOWN = 1; // 0x1
+ field public static final int PAGE_UP = 0; // 0x0
+ }
+
+ public class RadioButtonListItem extends androidx.car.widget.ListItem<androidx.car.widget.RadioButtonListItem.ViewHolder> {
+ ctor public RadioButtonListItem(android.content.Context);
+ method public static androidx.car.widget.RadioButtonListItem.ViewHolder createViewHolder(android.view.View);
+ method protected android.content.Context getContext();
+ method public int getViewType();
+ method public boolean isChecked();
+ method protected void onBind(androidx.car.widget.RadioButtonListItem.ViewHolder!);
+ method protected void resolveDirtyState();
+ method public void setChecked(boolean);
+ method public void setEnabled(boolean);
+ method public void setOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener);
+ method public void setPrimaryActionIcon(android.graphics.drawable.Icon, int);
+ method public void setShowRadioButtonDivider(boolean);
+ method public void setText(CharSequence?);
+ method public void setTextStartMargin(@DimenRes int);
+ field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
+ field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
+ field public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0; // 0x0
+ }
+
+ public static final class RadioButtonListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public RadioButtonListItem.ViewHolder(android.view.View);
+ method public android.view.ViewGroup getContainerLayout();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.RadioButton getRadioButton();
+ method public android.view.View getRadioButtonDivider();
+ method public android.widget.TextView getText();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+ public class SeekbarListItem extends androidx.car.widget.ListItem<androidx.car.widget.SeekbarListItem.ViewHolder> {
+ ctor public SeekbarListItem(android.content.Context);
+ method public static androidx.car.widget.SeekbarListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected android.content.Context getContext();
+ method public int getViewType();
+ method protected void onBind(androidx.car.widget.SeekbarListItem.ViewHolder!);
+ method protected void resolveDirtyState();
+ method public void setEnabled(boolean);
+ method public void setMax(int);
+ method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener!);
+ method public void setPrimaryActionEmptyIcon();
+ method public void setPrimaryActionIcon(android.graphics.drawable.Icon);
+ method @Deprecated public void setPrimaryActionIcon(@DrawableRes int);
+ method @Deprecated public void setPrimaryActionIcon(android.graphics.drawable.Drawable!);
+ method public void setPrimaryActionIconListener(android.view.View.OnClickListener!);
+ method public void setProgress(int);
+ method public void setSecondaryProgress(int);
+ method public void setSupplementalEmptyIcon(boolean);
+ method public void setSupplementalIcon(android.graphics.drawable.Icon, boolean);
+ method @Deprecated public void setSupplementalIcon(@DrawableRes int, boolean);
+ method @Deprecated public void setSupplementalIcon(android.graphics.drawable.Drawable, boolean);
+ method public void setSupplementalIconListener(android.view.View.OnClickListener!);
+ method public void setText(CharSequence?);
+ }
+
+ public static final class SeekbarListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder implements androidx.car.uxrestrictions.OnUxRestrictionsChangedListener {
+ ctor public SeekbarListItem.ViewHolder(android.view.View!);
+ method public android.view.ViewGroup getContainerLayout();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.SeekBar getSeekBar();
+ method public android.widget.ImageView getSupplementalIcon();
+ method public android.view.View getSupplementalIconDivider();
+ method public android.widget.TextView getText();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+ public class SubheaderListItem extends androidx.car.widget.ListItem<androidx.car.widget.SubheaderListItem.ViewHolder> {
+ ctor public SubheaderListItem(android.content.Context, CharSequence);
+ method public static androidx.car.widget.SubheaderListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected android.content.Context getContext();
+ method public int getViewType();
+ method protected void onBind(androidx.car.widget.SubheaderListItem.ViewHolder!);
+ method protected void resolveDirtyState();
+ method public void setEnabled(boolean);
+ method public void setText(CharSequence);
+ method public void setTextStartMarginType(@androidx.car.widget.SubheaderListItem.TextStartMarginType int);
+ field public static final int TEXT_START_MARGIN_TYPE_LARGE = 2; // 0x2
+ field public static final int TEXT_START_MARGIN_TYPE_NONE = 0; // 0x0
+ field public static final int TEXT_START_MARGIN_TYPE_SMALL = 1; // 0x1
+ }
+
+ @IntDef({androidx.car.widget.SubheaderListItem.TEXT_START_MARGIN_TYPE_NONE, androidx.car.widget.SubheaderListItem.TEXT_START_MARGIN_TYPE_LARGE, androidx.car.widget.SubheaderListItem.TEXT_START_MARGIN_TYPE_SMALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface SubheaderListItem.TextStartMarginType {
+ }
+
+ public static final class SubheaderListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public SubheaderListItem.ViewHolder(android.view.View!);
+ method public android.widget.TextView getText();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+ public class SwitchListItem extends androidx.car.widget.ListItem<androidx.car.widget.SwitchListItem.ViewHolder> {
+ ctor public SwitchListItem(android.content.Context);
+ method public static androidx.car.widget.SwitchListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected final android.content.Context getContext();
+ method public int getViewType();
+ method public void onBind(androidx.car.widget.SwitchListItem.ViewHolder!);
+ method @CallSuper protected void resolveDirtyState();
+ method public void setBody(CharSequence?);
+ method public void setClickable(boolean);
+ method public void setEnabled(boolean);
+ method public void setPrimaryActionEmptyIcon();
+ method public void setPrimaryActionIcon(android.graphics.drawable.Icon, int);
+ method public void setPrimaryActionNoIcon();
+ method public void setShowSwitchDivider(boolean);
+ method public void setSwitchOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener?);
+ method public void setSwitchState(boolean);
+ method public void setTitle(CharSequence?);
+ field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
+ field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
+ field public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0; // 0x0
+ }
+
+ public static final class SwitchListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public SwitchListItem.ViewHolder(android.view.View);
+ method public android.widget.TextView getBody();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.Switch getSwitch();
+ method public android.view.View getSwitchDivider();
+ method public android.widget.TextView getTitle();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+ public class TextListItem extends androidx.car.widget.ListItem<androidx.car.widget.TextListItem.ViewHolder> {
+ ctor public TextListItem(android.content.Context);
+ method public static androidx.car.widget.TextListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected android.content.Context getContext();
+ method public int getViewType();
+ method public void onBind(androidx.car.widget.TextListItem.ViewHolder!);
+ method protected void resolveDirtyState();
+ method public void setBody(CharSequence!);
+ method public void setEnabled(boolean);
+ method public void setOnClickListener(android.view.View.OnClickListener!);
+ method public void setPrimaryActionEmptyIcon();
+ method public void setPrimaryActionIcon(android.graphics.drawable.Icon, int);
+ method @Deprecated public void setPrimaryActionIcon(@DrawableRes int, int);
+ method @Deprecated public void setPrimaryActionIcon(android.graphics.drawable.Drawable?, int);
+ method public void setPrimaryActionNoIcon();
+ method public void setSupplementalIcon(android.graphics.drawable.Icon, boolean);
+ method @Deprecated public void setSupplementalIcon(int, boolean);
+ method @Deprecated public void setSupplementalIcon(android.graphics.drawable.Drawable!, boolean);
+ method @Deprecated public void setSupplementalIcon(int, boolean, android.view.View.OnClickListener!);
+ method @Deprecated public void setSupplementalIcon(android.graphics.drawable.Drawable!, boolean, android.view.View.OnClickListener!);
+ method public void setSupplementalIconOnClickListener(android.view.View.OnClickListener);
+ method @Deprecated public void setSwitch(boolean, boolean, android.widget.CompoundButton.OnCheckedChangeListener!);
+ method @Deprecated public void setSwitchState(boolean);
+ method public void setTitle(CharSequence!);
+ field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
+ field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
+ field public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0; // 0x0
+ }
+
+ public static final class TextListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public TextListItem.ViewHolder(android.view.View!);
+ method public android.widget.TextView getBody();
+ method public android.view.ViewGroup getContainerLayout();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.ImageView getSupplementalIcon();
+ method public android.view.View getSupplementalIconDivider();
+ method public android.widget.Switch getSwitch();
+ method public android.view.View getSwitchDivider();
+ method public android.widget.TextView getTitle();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
+}
+
diff --git a/car/core/api/current.txt b/car/core/api/current.txt
index 65258a0..a192354 100644
--- a/car/core/api/current.txt
+++ b/car/core/api/current.txt
@@ -554,6 +554,38 @@
method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
}
+ public class SwitchListItem extends androidx.car.widget.ListItem<androidx.car.widget.SwitchListItem.ViewHolder> {
+ ctor public SwitchListItem(android.content.Context);
+ method public static androidx.car.widget.SwitchListItem.ViewHolder createViewHolder(android.view.View!);
+ method protected final android.content.Context getContext();
+ method public int getViewType();
+ method public void onBind(androidx.car.widget.SwitchListItem.ViewHolder!);
+ method @CallSuper protected void resolveDirtyState();
+ method public void setBody(CharSequence?);
+ method public void setClickable(boolean);
+ method public void setEnabled(boolean);
+ method public void setPrimaryActionEmptyIcon();
+ method public void setPrimaryActionIcon(android.graphics.drawable.Icon, int);
+ method public void setPrimaryActionNoIcon();
+ method public void setShowSwitchDivider(boolean);
+ method public void setSwitchOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener?);
+ method public void setSwitchState(boolean);
+ method public void setTitle(CharSequence?);
+ field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
+ field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
+ field public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0; // 0x0
+ }
+
+ public static final class SwitchListItem.ViewHolder extends androidx.car.widget.ListItem.ViewHolder {
+ ctor public SwitchListItem.ViewHolder(android.view.View);
+ method public android.widget.TextView getBody();
+ method public android.widget.ImageView getPrimaryIcon();
+ method public android.widget.Switch getSwitch();
+ method public android.view.View getSwitchDivider();
+ method public android.widget.TextView getTitle();
+ method public void onUxRestrictionsChanged(androidx.car.uxrestrictions.CarUxRestrictions!);
+ }
+
public class TextListItem extends androidx.car.widget.ListItem<androidx.car.widget.TextListItem.ViewHolder> {
ctor public TextListItem(android.content.Context);
method public static androidx.car.widget.TextListItem.ViewHolder createViewHolder(android.view.View!);
@@ -575,8 +607,8 @@
method @Deprecated public void setSupplementalIcon(int, boolean, android.view.View.OnClickListener!);
method @Deprecated public void setSupplementalIcon(android.graphics.drawable.Drawable!, boolean, android.view.View.OnClickListener!);
method public void setSupplementalIconOnClickListener(android.view.View.OnClickListener);
- method public void setSwitch(boolean, boolean, android.widget.CompoundButton.OnCheckedChangeListener!);
- method public void setSwitchState(boolean);
+ method @Deprecated public void setSwitch(boolean, boolean, android.widget.CompoundButton.OnCheckedChangeListener!);
+ method @Deprecated public void setSwitchState(boolean);
method public void setTitle(CharSequence!);
field public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2; // 0x2
field public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1; // 0x1
diff --git a/car/core/api/res-1.0.0-alpha6.txt b/car/core/api/res-1.0.0-alpha6.txt
index df86b7a..44f230c 100644
--- a/car/core/api/res-1.0.0-alpha6.txt
+++ b/car/core/api/res-1.0.0-alpha6.txt
@@ -32,6 +32,9 @@
style TextAppearance_Car_Body4
style TextAppearance_Car_Body4_Dark
style TextAppearance_Car_Body4_Light
+style TextAppearance_Car_Body4_Medium
+style TextAppearance_Car_Body4_Medium_Dark
+style TextAppearance_Car_Body4_Medium_Light
style TextAppearance_Car_Display1
style TextAppearance_Car_Display2
style TextAppearance_Car_Display3
@@ -65,6 +68,7 @@
style Widget_Car_Button
style Widget_Car_Button_Borderless_Colored
style Widget_Car_Button_DarkText
+style Widget_Car_CarToolbar
style Widget_Car_Checkbox
style Widget_Car_Checkbox_Dark
style Widget_Car_Checkbox_Light
@@ -90,6 +94,7 @@
style Widget_Car_SeekBar
style Widget_Car_SeekBar_Dark
style Widget_Car_SeekBar_Light
+style Widget_Car_TabLayout
style Widget_Car_Toolbar
style Widget_Car_Toolbar_Button_Navigation
style Widget_Car_Toolbar_Button_Navigation_Light
@@ -232,6 +237,9 @@
color car_subtext5_dark
color car_subtext5_light
dimen car_subtext5_size
+dimen car_tab_min_width
+color car_tab_tint
+layout car_tab_view
color car_tint
color car_tint_dark
color car_tint_light
diff --git a/car/core/api/res-1.0.0-alpha7.txt b/car/core/api/res-1.0.0-alpha7.txt
new file mode 100644
index 0000000..44f230c
--- /dev/null
+++ b/car/core/api/res-1.0.0-alpha7.txt
@@ -0,0 +1,306 @@
+style CarListVerticalDivider
+style CarPreference
+style CarPreference_Category
+style CarPreference_CheckBoxPreference
+style CarPreference_DialogPreference
+style CarPreference_DialogPreference_EditTextPreference
+style CarPreference_DropDown
+style CarPreference_Information
+style CarPreference_PreferenceScreen
+style CarPreference_SeekBarPreference
+style CarPreference_SwitchPreference
+style CarPreference_SwitchPreferenceCompat
+style CarPreferenceFragment
+style CarPreferenceFragmentList
+style PreferenceThemeOverlayCar
+style TextAppearance_Car
+style TextAppearance_Car_Body1
+style TextAppearance_Car_Body1_Dark
+style TextAppearance_Car_Body1_Light
+style TextAppearance_Car_Body1_Medium
+style TextAppearance_Car_Body1_Medium_Dark
+style TextAppearance_Car_Body1_Medium_Light
+style TextAppearance_Car_Body2
+style TextAppearance_Car_Body2_Dark
+style TextAppearance_Car_Body2_Light
+style TextAppearance_Car_Body3
+style TextAppearance_Car_Body3_Dark
+style TextAppearance_Car_Body3_Light
+style TextAppearance_Car_Body3_Medium
+style TextAppearance_Car_Body3_Medium_Dark
+style TextAppearance_Car_Body3_Medium_Light
+style TextAppearance_Car_Body4
+style TextAppearance_Car_Body4_Dark
+style TextAppearance_Car_Body4_Light
+style TextAppearance_Car_Body4_Medium
+style TextAppearance_Car_Body4_Medium_Dark
+style TextAppearance_Car_Body4_Medium_Light
+style TextAppearance_Car_Display1
+style TextAppearance_Car_Display2
+style TextAppearance_Car_Display3
+style TextAppearance_Car_Display4
+style TextAppearance_Car_Error
+style TextAppearance_Car_Hint
+style TextAppearance_Car_Hint_Light
+style TextAppearance_Car_HintActionBar_Menu
+style TextAppearance_Car_SubText1
+style TextAppearance_Car_SubText2
+style TextAppearance_Car_SubText3
+style TextAppearance_Car_SubText4
+style TextAppearance_Car_SubText5
+style TextAppearance_Car_Subheader
+style Theme_Car_Dark_Dialog
+style Theme_Car_Dark_Dialog_Alert
+style Theme_Car_Dark_NoActionBar
+style Theme_Car_Dark_NoActionBar_Drawer
+style Theme_Car_Dialog
+style Theme_Car_Dialog_Alert
+style Theme_Car_Light_Dialog_Alert
+style Theme_Car_Light_List
+style Theme_Car_Light_List_DarkItems
+style Theme_Car_Light_NoActionBar
+style Theme_Car_Light_NoActionBar_Drawer
+style Theme_Car_List
+style Theme_Car_NoActionBar
+style Theme_Car_NoActionBar_Drawer
+style Widget_Car_ActionButton
+style Widget_Car_ActionButton_Light
+style Widget_Car_Button
+style Widget_Car_Button_Borderless_Colored
+style Widget_Car_Button_DarkText
+style Widget_Car_CarToolbar
+style Widget_Car_Checkbox
+style Widget_Car_Checkbox_Dark
+style Widget_Car_Checkbox_Light
+style Widget_Car_Dialog
+style Widget_Car_Dialog_Body
+style Widget_Car_Dialog_Body_Dark
+style Widget_Car_Dialog_Body_Light
+style Widget_Car_Dialog_Button
+style Widget_Car_Dialog_Title
+style Widget_Car_Dialog_Title_Dark
+style Widget_Car_Dialog_Title_Light
+style Widget_Car_DrawerArrowToggle
+style Widget_Car_EditText
+style Widget_Car_List
+style Widget_Car_List_Dark
+style Widget_Car_List_Light
+style Widget_Car_ListItem
+style Widget_Car_ListItem_Dark
+style Widget_Car_ProgressBar_Horizontal
+style Widget_Car_Scrollbar
+style Widget_Car_Scrollbar_Dark
+style Widget_Car_Scrollbar_Light
+style Widget_Car_SeekBar
+style Widget_Car_SeekBar_Dark
+style Widget_Car_SeekBar_Light
+style Widget_Car_TabLayout
+style Widget_Car_Toolbar
+style Widget_Car_Toolbar_Button_Navigation
+style Widget_Car_Toolbar_Button_Navigation_Light
+style Widget_Car_Toolbar_Light
+attr alignDividerEndTo
+attr alignDividerStartTo
+attr buttonRippleBackground
+attr buttonTintColor
+attr carArrowAnimate
+attr carArrowColor
+attr carArrowHeadLength
+attr carArrowShaftLength
+attr carArrowSize
+attr carArrowThickness
+attr carDialogTheme
+attr carMenuBarSpacing
+attr carMenuBarThickness
+color car_accent
+color car_accent_dark
+color car_accent_light
+dimen car_app_bar_default_elevation
+dimen car_app_bar_height
+dimen car_app_icon_size
+dimen car_application_icon_size
+dimen car_avatar_icon_size
+color car_body1
+color car_body1_dark
+color car_body1_light
+dimen car_body1_size
+color car_body2
+color car_body2_dark
+color car_body2_light
+dimen car_body2_size
+color car_body3
+color car_body3_dark
+color car_body3_light
+dimen car_body3_size
+color car_body4
+color car_body4_dark
+color car_body4_light
+dimen car_body4_size
+dimen car_button_height
+dimen car_button_min_width
+dimen car_button_radius
+color car_card
+color car_card_action_bar
+color car_card_action_bar_dark
+dimen car_card_action_bar_height
+color car_card_action_bar_light
+color car_card_dark
+dimen car_card_header_height
+color car_card_light
+color car_card_ripple_background
+color car_card_ripple_background_dark
+color car_card_ripple_background_light
+dimen car_dialog_action_bar_height
+dimen car_dialog_elevation
+dimen car_dialog_header_height
+color car_display1
+color car_display1_dark
+color car_display1_light
+dimen car_display1_size
+color car_display2
+color car_display2_dark
+color car_display2_light
+dimen car_display2_size
+color car_display3
+color car_display3_dark
+color car_display3_light
+dimen car_display3_size
+color car_display4
+color car_display4_dark
+color car_display4_light
+dimen car_display4_size
+dimen car_double_line_list_item_height
+layout car_drawer
+layout car_drawer_activity
+dimen car_drawer_max_width
+dimen car_fab_icon_size
+dimen car_gutter_width
+dimen car_keyline_1
+dimen car_keyline_1_neg
+dimen car_keyline_2
+dimen car_keyline_2_neg
+dimen car_keyline_3
+dimen car_keyline_3_neg
+dimen car_keyline_4
+dimen car_keyline_4_neg
+dimen car_large_avatar_size
+dimen car_list_dialog_title_elevation
+color car_list_divider
+color car_list_divider_dark
+dimen car_list_divider_height
+color car_list_divider_light
+color car_list_header
+dimen car_margin
+dimen car_navigation_bar_height
+dimen car_padding_0
+dimen car_padding_1
+dimen car_padding_2
+dimen car_padding_3
+dimen car_padding_4
+dimen car_padding_5
+dimen car_padding_6
+dimen car_pill_button_size
+dimen car_primary_icon_size
+dimen car_radius_1
+dimen car_radius_2
+dimen car_radius_3
+dimen car_radius_4
+color car_scrollbar_thumb
+color car_scrollbar_thumb_dark
+color car_scrollbar_thumb_light
+dimen car_secondary_icon_size
+color car_seekbar_track_background
+color car_seekbar_track_background_dark
+color car_seekbar_track_background_light
+color car_seekbar_track_secondary_progress
+dimen car_single_line_list_item_height
+dimen car_status_bar_height
+dimen car_status_bar_icon_size
+dimen car_sub_header_height
+color car_subtext1
+color car_subtext1_dark
+color car_subtext1_light
+dimen car_subtext1_size
+color car_subtext2
+color car_subtext2_dark
+color car_subtext2_light
+dimen car_subtext2_size
+color car_subtext3
+color car_subtext3_dark
+color car_subtext3_light
+dimen car_subtext3_size
+color car_subtext4
+color car_subtext4_dark
+color car_subtext4_light
+dimen car_subtext4_size
+color car_subtext5
+color car_subtext5_dark
+color car_subtext5_light
+dimen car_subtext5_size
+dimen car_tab_min_width
+color car_tab_tint
+layout car_tab_view
+color car_tint
+color car_tint_dark
+color car_tint_light
+dimen car_touch_target_size
+dimen car_vertical_line_divider_height
+dimen car_vertical_line_divider_width
+attr columnSpan
+attr dialogBackgroundColor
+attr dialogBodyStyle
+attr dialogButtonStyle
+attr dialogListTheme
+attr dialogTitleStyle
+attr dividerEndMargin
+attr dividerStartMargin
+attr downButtonIcon
+attr drawerBackButtonId
+attr drawerBackButtonTint
+attr drawerBackgroundColor
+attr drawerHeaderColor
+attr drawerItemBodyTextAppearance
+attr drawerItemTitleTextAppearance
+attr drawerListId
+attr drawerListTheme
+attr drawerNormalLayoutId
+attr drawerProgressId
+attr drawerRippleColor
+attr drawerSmallLayoutId
+attr drawerTitleId
+attr drawerToolbarId
+attr gutter
+attr gutterSize
+attr itemSpacing
+attr listContentTopOffset
+attr listDividerColor
+attr listEndMargin
+attr listItemActionDividerColor
+attr listItemBackgroundColor
+attr listItemBodyTextAppearance
+attr listItemSubheaderTextAppearance
+attr listItemTitleTextAppearance
+attr navigationIcon
+attr navigationIconContainerWidth
+attr navigationIconTint
+attr offsetScrollBar
+attr overflowIcon
+attr pagedListViewStyle
+attr pagedScrollBarViewStyle
+attr scrollBarColor
+attr scrollBarContainerWidth
+attr scrollBarEnabled
+attr scrollBarGravity
+attr scrollBarTopMargin
+attr showPagedListViewDivider
+attr showScrollBarThumb
+attr subtitle
+attr subtitleTextAppearance
+attr title
+attr titleIcon
+attr titleIconEndMargin
+attr titleIconSize
+attr titleIconStartMargin
+attr titleTextAppearance
+attr upButtonIcon
+attr verticallyCenterListContent
diff --git a/car/core/res-public/values/public_colors.xml b/car/core/res-public/values/public_colors.xml
index 0c3293c..1716214 100644
--- a/car/core/res-public/values/public_colors.xml
+++ b/car/core/res-public/values/public_colors.xml
@@ -100,4 +100,7 @@
<public type="color" name="car_accent_dark" />
<public type="color" name="car_accent_light" />
<public type="color" name="car_accent" />
+
+ <!-- Tab colors -->
+ <public type="color" name="car_tab_tint" />
</resources>
diff --git a/car/core/res-public/values/public_dimens.xml b/car/core/res-public/values/public_dimens.xml
index a984f00..208e3af 100644
--- a/car/core/res-public/values/public_dimens.xml
+++ b/car/core/res-public/values/public_dimens.xml
@@ -120,4 +120,7 @@
<!-- Drawer max width -->
<public type="dimen" name="car_drawer_max_width" />
+
+ <!-- Tabs -->
+ <public type="dimen" name="car_tab_min_width" />
</resources>
diff --git a/car/core/res-public/values/public_layouts.xml b/car/core/res-public/values/public_layouts.xml
index b345bdb..076e473 100644
--- a/car/core/res-public/values/public_layouts.xml
+++ b/car/core/res-public/values/public_layouts.xml
@@ -20,4 +20,5 @@
<!-- Layouts for the drawer -->
<public type="layout" name="car_drawer" />
<public type="layout" name="car_drawer_activity" />
+ <public type="layout" name="car_tab_view" />
</resources>
diff --git a/car/core/res-public/values/public_styles.xml b/car/core/res-public/values/public_styles.xml
index 64b549a..0b1996c 100644
--- a/car/core/res-public/values/public_styles.xml
+++ b/car/core/res-public/values/public_styles.xml
@@ -39,8 +39,11 @@
<public type="style" name="TextAppearance.Car.Body3.Dark" />
<public type="style" name="TextAppearance.Car.Body3.Medium.Dark" />
<public type="style" name="TextAppearance.Car.Body4" />
+ <public type="style" name="TextAppearance.Car.Body4.Medium" />
<public type="style" name="TextAppearance.Car.Body4.Light" />
+ <public type="style" name="TextAppearance.Car.Body4.Medium.Light" />
<public type="style" name="TextAppearance.Car.Body4.Dark" />
+ <public type="style" name="TextAppearance.Car.Body4.Medium.Dark" />
<public type="style" name="TextAppearance.Car.SubText1" />
<public type="style" name="TextAppearance.Car.SubText2" />
<public type="style" name="TextAppearance.Car.SubText3" />
@@ -53,6 +56,8 @@
<public type="style" name="TextAppearance.Car.Error" />
<!-- Widgets -->
+ <public type="style" name="Widget.Car.TabLayout" />
+ <public type="style" name="Widget.Car.CarToolbar" />
<public type="style" name="Widget.Car.Toolbar" />
<public type="style" name="Widget.Car.Toolbar.Light" />
<public type="style" name="Widget.Car.Toolbar.Button.Navigation" />
diff --git a/car/core/res/color/car_tab_tint.xml b/car/core/res/color/car_tab_tint.xml
new file mode 100644
index 0000000..71e813f
--- /dev/null
+++ b/car/core/res/color/car_tab_tint.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- The tinting for tabs in a TabLayout. This color specifies selected color as this is what is
+ used to change colors within the TabLayout. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false"
+ android:alpha="0.5"
+ android:color="@color/car_grey_300"/>
+ <item android:state_selected="false"
+ android:alpha="0.5"
+ android:color="@color/car_grey_300"/>
+ <item android:color="@color/car_grey_300"/>
+</selector>
diff --git a/car/core/res/layout/car_list_item_switch_content.xml b/car/core/res/layout/car_list_item_switch_content.xml
new file mode 100644
index 0000000..5897a78
--- /dev/null
+++ b/car/core/res/layout/car_list_item_switch_content.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:ignore="MissingConstraints"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/car_single_line_list_item_height"
+ android:foreground="@drawable/car_card_ripple_background" >
+
+ <!-- Primary Action. -->
+ <ImageView
+ android:id="@+id/primary_icon"
+ android:layout_width="@dimen/car_single_line_list_item_height"
+ android:layout_height="@dimen/car_single_line_list_item_height"
+ android:tint="?attr/listItemPrimaryIconTint"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"/>
+
+ <!-- Text. -->
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:textAppearance="?attr/listItemTitleTextAppearance"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toTopOf="@+id/body"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/barrier"
+ app:layout_constraintVertical_chainStyle="packed"/>
+
+ <TextView
+ android:id="@+id/body"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:textAppearance="?attr/listItemBodyTextAppearance"
+ app:layout_constraintTop_toBottomOf="@+id/title"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/barrier"/>
+
+ <!-- A barrier between the text and switch. -->
+ <androidx.constraintlayout.widget.Barrier
+ android:id="@+id/barrier"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:barrierDirection="start"
+ app:barrierAllowsGoneWidgets="false"
+ app:constraint_referenced_ids="switch_divider,switch_widget" />
+
+ <!-- Guideline that the switch is centered upon. -->
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/supplemental_actions_guideline"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.5" />
+
+ <!-- Switch with divider. -->
+ <View
+ android:id="@+id/switch_divider"
+ android:background="?attr/listItemActionDividerColor"
+ android:layout_marginEnd="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="@+id/supplemental_actions_guideline"
+ app:layout_constraintBottom_toBottomOf="@+id/supplemental_actions_guideline"
+ app:layout_constraintEnd_toStartOf="@+id/switch_widget"
+ style="@style/CarListVerticalDivider"/>
+
+ <Switch
+ android:id="@+id/switch_widget"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/car_keyline_1"
+ app:layout_constraintTop_toTopOf="@+id/supplemental_actions_guideline"
+ app:layout_constraintBottom_toBottomOf="@+id/supplemental_actions_guideline"
+ app:layout_constraintEnd_toEndOf="parent"
+ style="?attr/switchStyle" />
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/car/core/res/values/dimens.xml b/car/core/res/values/dimens.xml
index d705e37..234df29 100644
--- a/car/core/res/values/dimens.xml
+++ b/car/core/res/values/dimens.xml
@@ -203,4 +203,6 @@
<!-- list margin won't be necessary after PagedListView is brought in -->
<dimen name="car_preference_list_margin">8dp</dimen>
+ <!-- Tabs -->
+ <dimen name="car_tab_min_width">140dp</dimen>
</resources>
diff --git a/car/core/res/values/styles.xml b/car/core/res/values/styles.xml
index 1d2c501..c3eb2cd 100644
--- a/car/core/res/values/styles.xml
+++ b/car/core/res/values/styles.xml
@@ -133,14 +133,26 @@
<item name="android:textColor">@color/car_body4</item>
</style>
+ <style name="TextAppearance.Car.Body4.Medium">
+ <item name="android:fontFamily">sans-serif-medium</item>
+ </style>
+
<style name="TextAppearance.Car.Body4.Light">
<item name="android:textColor">@color/car_body4_light</item>
</style>
+ <style name="TextAppearance.Car.Body4.Medium.Light">
+ <item name="android:textColor">@color/car_body4_light</item>
+ </style>
+
<style name="TextAppearance.Car.Body4.Dark">
<item name="android:textColor">@color/car_body4_dark</item>
</style>
+ <style name="TextAppearance.Car.Body4.Medium.Dark">
+ <item name="android:textColor">@color/car_body4_dark</item>
+ </style>
+
<style name="TextAppearance.Car.SubText1">
<item name="android:textStyle">normal</item>
<item name="android:textSize">@dimen/car_subtext1_size</item>
@@ -369,6 +381,25 @@
<item name="android:background">@color/car_list_divider</item>
</style>
+ <!-- =============== -->
+ <!-- TabLayout Style -->
+ <!-- =============== -->
+ <eat-comment />
+
+ <!-- Styling for a TabLayout. This style colors the TabLayout with a dark theme. Make sure to
+ also use the layout car_tab_view as the custom view for each tab. -->
+ <style name="Widget.Car.TabLayout" parent="Widget.MaterialComponents.TabLayout">
+ <item name="android:background">@android:color/black</item>
+ <item name="tabRippleColor">@color/car_card_ripple_background_light</item>
+ <item name="tabGravity">fill</item>
+ <item name="tabTextColor">@color/car_tab_tint</item>
+ <item name="tabIndicatorColor">@android:color/transparent</item>
+ <item name="tabIndicatorHeight">0dp</item>
+ <item name="tabMinWidth">@dimen/car_tab_min_width</item>
+ <item name="tabIconTint">@color/car_tab_tint</item>
+ <item name="tabTextAppearance">@style/TextAppearance.Car.Body4.Medium.Light</item>
+ </style>
+
<!-- =========== -->
<!-- List Styles -->
<!-- =========== -->
diff --git a/car/core/res/values/themes.xml b/car/core/res/values/themes.xml
index c1bfef32..e0ec1c1 100644
--- a/car/core/res/values/themes.xml
+++ b/car/core/res/values/themes.xml
@@ -80,6 +80,7 @@
<item name="pagedScrollBarViewStyle">@style/Widget.Car.Scrollbar.Light</item>
<item name="seekBarStyle">@style/Widget.Car.SeekBar.Light</item>
<item name="switchStyle">@style/Widget.Car.Switch</item>
+ <item name="tabStyle">@style/Widget.Car.TabLayout</item>
<item name="checkboxStyle">@style/Widget.Car.CheckBox.Light</item>
<item name="toolbarNavigationButtonStyle">@style/Widget.Car.Toolbar.Button.Navigation.Light</item>
<item name="toolbarStyle">@style/Widget.Car.Toolbar.Light</item>
diff --git a/car/core/src/androidTest/java/androidx/car/widget/CarToolbarTest.java b/car/core/src/androidTest/java/androidx/car/widget/CarToolbarTest.java
index 2e73bce..ce506d6 100644
--- a/car/core/src/androidTest/java/androidx/car/widget/CarToolbarTest.java
+++ b/car/core/src/androidTest/java/androidx/car/widget/CarToolbarTest.java
@@ -18,6 +18,7 @@
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.PositionAssertions.isCompletelyLeftOf;
import static androidx.test.espresso.assertion.PositionAssertions.isCompletelyRightOf;
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
@@ -66,8 +67,10 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
/**
* Unit tests for {@link CarToolbar}.
@@ -308,6 +311,26 @@
}
@Test
+ public void testSetMenuItems_NullClearsItems() throws Throwable {
+ String actionItemText = "checkable_item_text";
+ CarMenuItem actionItem = new CarMenuItem
+ .Builder()
+ .setTitle(actionItemText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS) // Action item
+ .build();
+
+ mActivityRule.runOnUiThread(() ->
+ mToolbar.setMenuItems(Collections.singletonList(actionItem)));
+
+ // Wait for item to show.
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ mActivityRule.runOnUiThread(() -> mToolbar.setMenuItems(null));
+
+ onView(withText(actionItemText)).check(doesNotExist());
+ }
+
+ @Test
public void testActionItemWithIconDisplaysIcon() throws Throwable {
String actionItemText = "action_item_text";
CarMenuItem actionItem = new CarMenuItem
@@ -524,10 +547,12 @@
.setTitle(overflowItemText)
.build();
- mActivityRule.runOnUiThread(() -> {
- mToolbar.setMenuItems(Collections.singletonList(overflowItem));
- mToolbar.showOverflowMenu();
- });
+ mActivityRule.runOnUiThread(() ->
+ mToolbar.setMenuItems(Collections.singletonList(overflowItem)));
+
+ // Since overflow items are set in onMeasure, need to wait for the views to be laid out.
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ mActivityRule.runOnUiThread(() -> mToolbar.showOverflowMenu());
onView(withText(overflowItemText)).inRoot(isDialog()).check(matches(isDisplayed()));
}
@@ -572,6 +597,138 @@
assertTrue(clicked[0]);
}
+ @Test
+ public void testIfRoomItemDisplayedInOrderProvided() throws Throwable {
+ List<CarMenuItem> items = new ArrayList<>();
+ String action1Text = "action_item_1";
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(action1Text)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS)
+ .build());
+
+ String ifRoomItemText = "if_room_item_text";
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(ifRoomItemText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.IF_ROOM)
+ .build());
+
+ String action2Text = "action_item_2";
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(action2Text)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS)
+ .build());
+
+
+ mActivityRule.runOnUiThread(() -> mToolbar.setMenuItems(items));
+
+ onView(withText(ifRoomItemText)).check(isCompletelyLeftOf(withText(action1Text)));
+ onView(withText(ifRoomItemText)).check(isCompletelyRightOf(withText(action2Text)));
+ }
+
+ @Test
+ public void testIfRoomItemDisplayedIfRoomAvailable() throws Throwable {
+ String ifRoomItemText = "if_room_item_text";
+ CarMenuItem ifRoomItem = new CarMenuItem
+ .Builder()
+ .setTitle(ifRoomItemText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.IF_ROOM)
+ .build();
+
+ mActivityRule.runOnUiThread(() ->
+ mToolbar.setMenuItems(Collections.singletonList(ifRoomItem)));
+
+ onView(withText(ifRoomItemText)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void testIfRoomItemAddedToOverflowIfOverCountLimit() throws Throwable {
+ List<CarMenuItem> items = new ArrayList<>();
+ for (int i = 0; i < CarToolbar.ACTION_ITEM_COUNT_LIMIT; i++) {
+ items.add(new CarMenuItem
+ .Builder()
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS)
+ .build());
+ }
+
+ String ifRoomItemText = "if_room_item_text";
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(ifRoomItemText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.IF_ROOM)
+ .build());
+
+ mActivityRule.runOnUiThread(() -> mToolbar.setMenuItems(items));
+
+ onView(withText(ifRoomItemText)).check(doesNotExist());
+
+ // Open overflow menu.
+ onView(withId(R.id.overflow_menu)).perform(click());
+
+ onView(withText(ifRoomItemText)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void testIfRoomItemAddedToOverflowIfOverWidthPercentageLimit() throws Throwable {
+ // Add just one ALWAYS item with long text so that ACTION_ITEM_COUNT_LIMIT is not reached.
+ String longText = mActivity.getString(R.string.over_uxr_text_length_limit);
+ List<CarMenuItem> items = new ArrayList<>();
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(longText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS)
+ .build());
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ String ifRoomItemText = "if_room_item_text";
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(ifRoomItemText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.IF_ROOM)
+ .build());
+
+ mActivityRule.runOnUiThread(() -> mToolbar.setMenuItems(items));
+
+ onView(withText(ifRoomItemText)).check(doesNotExist());
+
+ mActivityRule.runOnUiThread(() -> mToolbar.showOverflowMenu());
+
+ onView(withText(ifRoomItemText)).check(matches(isDisplayed()));
+ }
+
+ @Test
+ public void testIfRoomItemPushedFromActionToOverflowIfLimitExceeded() throws Throwable {
+ List<CarMenuItem> items = new ArrayList<>();
+ items.add(new CarMenuItem
+ .Builder()
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS)
+ .build());
+
+ String ifRoomItemText = "if_room_item_text";
+ items.add(new CarMenuItem
+ .Builder()
+ .setTitle(ifRoomItemText)
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.IF_ROOM)
+ .build());
+
+ mActivityRule.runOnUiThread(() -> mToolbar.setMenuItems(items));
+
+ onView(withText(ifRoomItemText)).check(matches(isDisplayed()));
+
+ for (int i = 0; i < CarToolbar.ACTION_ITEM_COUNT_LIMIT - 1; i++) {
+ items.add(new CarMenuItem
+ .Builder()
+ .setDisplayBehavior(CarMenuItem.DisplayBehavior.ALWAYS)
+ .build());
+ }
+ mActivityRule.runOnUiThread(() -> mToolbar.setMenuItems(items));
+
+ onView(withText(ifRoomItemText)).check(doesNotExist());
+ onView(withId(R.id.overflow_menu)).check(matches(isDisplayed()));
+ }
+
private TextView getTitleView() {
return mActivity.findViewById(R.id.title);
}
diff --git a/car/core/src/androidTest/java/androidx/car/widget/SwitchListItemTest.java b/car/core/src/androidTest/java/androidx/car/widget/SwitchListItemTest.java
new file mode 100644
index 0000000..cd842bd
--- /dev/null
+++ b/car/core/src/androidTest/java/androidx/car/widget/SwitchListItemTest.java
@@ -0,0 +1,836 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.car.widget;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
+import static androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.lessThan;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.number.IsCloseTo.closeTo;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Icon;
+import android.text.InputFilter;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+
+import androidx.car.test.R;
+import androidx.car.util.CarUxRestrictionsTestUtils;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.espresso.UiController;
+import androidx.test.espresso.ViewAction;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import org.hamcrest.Matcher;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+
+/**
+* Tests the layout configuration and switch functionality of {@link SwitchListItem}.
+ */
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class SwitchListItemTest {
+
+ @Rule
+ public ActivityTestRule<PagedListViewTestActivity> mActivityRule =
+ new ActivityTestRule<>(PagedListViewTestActivity.class);
+
+ private PagedListViewTestActivity mActivity;
+ private PagedListView mPagedListView;
+ private ListItemAdapter mAdapter;
+
+ private boolean isAutoDevice() {
+ PackageManager packageManager = mActivityRule.getActivity().getPackageManager();
+ return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
+ }
+
+ @Before
+ public void setUp() {
+ Assume.assumeTrue(isAutoDevice());
+
+ mActivity = mActivityRule.getActivity();
+ mPagedListView = mActivity.findViewById(R.id.paged_list_view);
+ }
+
+ @Test
+ public void testDefaultVisibility_EmptyItemShowsSwitch() {
+ SwitchListItem item = new SwitchListItem(mActivity);
+ setupPagedListView(Arrays.asList(item));
+
+ ViewGroup itemView = (ViewGroup)
+ mPagedListView.getRecyclerView().getLayoutManager().getChildAt(0);
+ int childCount = itemView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View view = itemView.getChildAt(i);
+ // |view| could be container in view holder, so exempt ViewGroup.
+ if (view instanceof Switch || view instanceof ViewGroup) {
+ assertThat(view.getVisibility(), is(equalTo(View.VISIBLE)));
+ } else {
+ assertThat("Visibility of view "
+ + mActivity.getResources().getResourceEntryName(view.getId())
+ + " by default should be GONE.",
+ view.getVisibility(), is(equalTo(View.GONE)));
+ }
+ }
+ }
+
+ @Test
+ public void testItemIsEnabledByDefault() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ assertTrue(getViewHolderAtPosition(0).itemView.isEnabled());
+ }
+
+ @Test
+ public void testDisablingItem() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ item0.setEnabled(false);
+ refreshUi();
+
+ assertFalse(getViewHolderAtPosition(0).itemView.isEnabled());
+ }
+
+ @Test
+ public void testClickableItem_DefaultNotClickable() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ assertFalse(getViewHolderAtPosition(0).itemView.isClickable());
+ }
+
+ @Test
+ public void testClickableItem_setClickable() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setClickable(true);
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ assertTrue(getViewHolderAtPosition(0).itemView.isClickable());
+ }
+
+ @Test
+ public void testClickableItem_ClickingTogglesSwitch() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setClickable(true);
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition(0, click()));
+
+ assertTrue(getViewHolderAtPosition(0).getSwitch().isChecked());
+ }
+
+ @Test
+ public void testSwitchStatePersistsOnRebind() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ // Switch initially checked.
+ item0.setSwitchState(true);
+
+ setupPagedListView(Collections.singletonList(item0));
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+
+ toggleChecked(viewHolder.getSwitch());
+
+ viewHolder = getViewHolderAtPosition(0);
+ assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
+ }
+
+ @Test
+ public void testSetSwitchState() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchState(true);
+
+ setupPagedListView(Arrays.asList(item0));
+
+ item0.setSwitchState(false);
+ refreshUi();
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
+ assertThat(viewHolder.getSwitch().isChecked(), is(equalTo(false)));
+ }
+
+ @Test
+ public void testSetSwitchStateCallsListener() {
+ CompoundButton.OnCheckedChangeListener listener =
+ mock(CompoundButton.OnCheckedChangeListener.class);
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchOnCheckedChangeListener(listener);
+
+ setupPagedListView(Collections.singletonList(item0));
+
+ item0.setSwitchState(true);
+ refreshUi();
+ verify(listener).onCheckedChanged(any(CompoundButton.class), eq(true));
+ }
+
+ @Test
+ public void testRefreshingUiDoesNotCallListener() {
+ CompoundButton.OnCheckedChangeListener listener =
+ mock(CompoundButton.OnCheckedChangeListener.class);
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchOnCheckedChangeListener(listener);
+
+ setupPagedListView(Collections.singletonList(item0));
+
+ refreshUi();
+ verify(listener, never()).onCheckedChanged(any(CompoundButton.class), anyBoolean());
+ }
+
+ @Test
+ public void testSetSwitchStateBeforeFirstBindCallsListener() {
+ CompoundButton.OnCheckedChangeListener listener =
+ mock(CompoundButton.OnCheckedChangeListener.class);
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchOnCheckedChangeListener(listener);
+ item0.setSwitchState(true);
+
+ setupPagedListView(Collections.singletonList(item0));
+
+ verify(listener).onCheckedChanged(any(CompoundButton.class), eq(true));
+ }
+
+ @Test
+ public void testSwitchToggleCallsListener() {
+ CompoundButton.OnCheckedChangeListener listener =
+ mock(CompoundButton.OnCheckedChangeListener.class);
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchOnCheckedChangeListener(listener);
+
+ setupPagedListView(Collections.singletonList(item0));
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ toggleChecked(viewHolder.getSwitch());
+
+ // Expect true because switch defaults to false.
+ verify(listener).onCheckedChanged(any(CompoundButton.class), eq(true));
+ }
+
+ @Test
+ public void testSetSwitchStateNotDirtyDoesNotCallListener() {
+ CompoundButton.OnCheckedChangeListener listener =
+ mock(CompoundButton.OnCheckedChangeListener.class);
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchState(true);
+ item0.setSwitchOnCheckedChangeListener(listener);
+
+ setupPagedListView(Collections.singletonList(item0));
+
+ item0.setSwitchState(true);
+ refreshUi();
+
+ verify(listener, never()).onCheckedChanged(any(CompoundButton.class), anyBoolean());
+ }
+
+ @Test
+ public void testCheckingSwitch() {
+ final boolean[] clicked = {false};
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setSwitchOnCheckedChangeListener((button, isChecked) -> {
+ // Initial value is false.
+ assertTrue(isChecked);
+ clicked[0] = true;
+ });
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ onView(withId(R.id.recycler_view)).perform(
+ actionOnItemAtPosition(0, clickChildViewWithId(R.id.switch_widget)));
+ assertTrue(clicked[0]);
+ }
+
+ @Test
+ public void testDividerVisibility() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setShowSwitchDivider(true);
+
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item0.setShowSwitchDivider(false);
+
+ List<SwitchListItem> items = Arrays.asList(item0, item1);
+ setupPagedListView(items);
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
+ assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
+
+ viewHolder = getViewHolderAtPosition(1);
+ assertThat(viewHolder.getSwitch().getVisibility(), is(equalTo(View.VISIBLE)));
+ assertThat(viewHolder.getSwitchDivider().getVisibility(), is(equalTo(View.GONE)));
+ }
+
+ @Test
+ public void testPrimaryActionVisible() {
+ SwitchListItem largeIcon = new SwitchListItem(mActivity);
+ largeIcon.setPrimaryActionIcon(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_LARGE);
+
+ SwitchListItem mediumIcon = new SwitchListItem(mActivity);
+ mediumIcon.setPrimaryActionIcon(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_MEDIUM);
+
+ SwitchListItem smallIcon = new SwitchListItem(mActivity);
+ smallIcon.setPrimaryActionIcon(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+
+ List<SwitchListItem> items = Arrays.asList(largeIcon, mediumIcon, smallIcon);
+ setupPagedListView(items);
+
+ assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getVisibility(),
+ is(equalTo(View.VISIBLE)));
+ assertThat(getViewHolderAtPosition(1).getPrimaryIcon().getVisibility(),
+ is(equalTo(View.VISIBLE)));
+ assertThat(getViewHolderAtPosition(2).getPrimaryIcon().getVisibility(),
+ is(equalTo(View.VISIBLE)));
+ }
+
+ @Test
+ public void testTextVisible() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setTitle("title");
+
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item1.setBody("body");
+
+ List<SwitchListItem> items = Arrays.asList(item0, item1);
+ setupPagedListView(items);
+
+ assertThat(getViewHolderAtPosition(0).getTitle().getVisibility(),
+ is(equalTo(View.VISIBLE)));
+ assertThat(getViewHolderAtPosition(1).getBody().getVisibility(),
+ is(equalTo(View.VISIBLE)));
+ }
+
+ @Test
+ public void testTextStartMarginMatchesPrimaryActionType() {
+ SwitchListItem largeIcon = new SwitchListItem(mActivity);
+ largeIcon.setPrimaryActionIcon(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_LARGE);
+
+ SwitchListItem mediumIcon = new SwitchListItem(mActivity);
+ mediumIcon.setPrimaryActionIcon(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_MEDIUM);
+
+ SwitchListItem smallIcon = new SwitchListItem(mActivity);
+ smallIcon.setPrimaryActionIcon(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+
+ SwitchListItem emptyIcon = new SwitchListItem(mActivity);
+ emptyIcon.setPrimaryActionEmptyIcon();
+
+ SwitchListItem noIcon = new SwitchListItem(mActivity);
+ noIcon.setPrimaryActionNoIcon();
+
+ List<SwitchListItem> items = Arrays.asList(
+ largeIcon, mediumIcon, smallIcon, emptyIcon, noIcon);
+ List<Integer> expectedStartMargin = Arrays.asList(
+ R.dimen.car_keyline_4, // Large icon.
+ R.dimen.car_keyline_3, // Medium icon.
+ R.dimen.car_keyline_3, // Small icon.
+ R.dimen.car_keyline_3, // Empty icon.
+ R.dimen.car_keyline_1); // No icon.
+ setupPagedListView(items);
+
+ for (int i = 0; i < items.size(); i++) {
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(i);
+
+ int expected = ApplicationProvider.getApplicationContext().getResources()
+ .getDimensionPixelSize(expectedStartMargin.get(i));
+ assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getTitle().getLayoutParams())
+ .getMarginStart(), is(equalTo(expected)));
+ assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getBody().getLayoutParams())
+ .getMarginStart(), is(equalTo(expected)));
+ }
+ }
+
+ @Test
+ public void testItemWithOnlyTitleIsSingleLine() {
+ // Only space.
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setTitle(" ");
+
+ // Underscore.
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item1.setTitle("______");
+
+ SwitchListItem item2 = new SwitchListItem(mActivity);
+ item2.setTitle("ALL UPPER CASE");
+
+ // String wouldn't fit in one line.
+ SwitchListItem item3 = new SwitchListItem(mActivity);
+ item3.setTitle(ApplicationProvider.getApplicationContext().getResources().getString(
+ R.string.over_uxr_text_length_limit));
+
+ List<SwitchListItem> items = Arrays.asList(item0, item1, item2, item3);
+ setupPagedListView(items);
+
+ double singleLineHeight =
+ ApplicationProvider.getApplicationContext().getResources().getDimension(
+ R.dimen.car_single_line_list_item_height);
+
+ LinearLayoutManager layoutManager =
+ (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
+ for (int i = 0; i < items.size(); i++) {
+ assertThat((double) layoutManager.findViewByPosition(i).getHeight(),
+ is(closeTo(singleLineHeight, 1.0d)));
+ }
+ }
+
+ @Test
+ public void testItemWithBodyTextIsAtLeastDoubleLine() {
+ // Only space.
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setBody(" ");
+
+ // Underscore.
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item1.setBody("____");
+
+ // String wouldn't fit in one line.
+ SwitchListItem item2 = new SwitchListItem(mActivity);
+ item2.setBody(ApplicationProvider.getApplicationContext().getResources().getString(
+ R.string.over_uxr_text_length_limit));
+
+ List<SwitchListItem> items = Arrays.asList(item0, item1, item2);
+ setupPagedListView(items);
+
+ final int doubleLineHeight =
+ (int) ApplicationProvider.getApplicationContext().getResources().getDimension(
+ R.dimen.car_double_line_list_item_height);
+
+ LinearLayoutManager layoutManager =
+ (LinearLayoutManager) mPagedListView.getRecyclerView().getLayoutManager();
+ for (int i = 0; i < items.size(); i++) {
+ assertThat(layoutManager.findViewByPosition(i).getHeight(),
+ is(greaterThanOrEqualTo(doubleLineHeight)));
+ }
+ }
+
+ @Test
+ public void testSetPrimaryActionIcon() {
+ SwitchListItem item = new SwitchListItem(mActivity);
+ item.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_LARGE);
+
+ List<SwitchListItem> items = Arrays.asList(item);
+ setupPagedListView(items);
+
+ assertThat(getViewHolderAtPosition(0).getPrimaryIcon().getDrawable(), is(notNullValue()));
+ }
+
+ @Test
+ public void testPrimaryIconSizesInIncreasingOrder() {
+ SwitchListItem small = new SwitchListItem(mActivity);
+ small.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+
+ SwitchListItem medium = new SwitchListItem(mActivity);
+ medium.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_MEDIUM);
+
+ SwitchListItem large = new SwitchListItem(mActivity);
+ large.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_LARGE);
+
+ List<SwitchListItem> items = Arrays.asList(small, medium, large);
+ setupPagedListView(items);
+
+ SwitchListItem.ViewHolder smallVH = getViewHolderAtPosition(0);
+ SwitchListItem.ViewHolder mediumVH = getViewHolderAtPosition(1);
+ SwitchListItem.ViewHolder largeVH = getViewHolderAtPosition(2);
+
+ assertThat(largeVH.getPrimaryIcon().getHeight(), is(greaterThan(
+ mediumVH.getPrimaryIcon().getHeight())));
+ assertThat(mediumVH.getPrimaryIcon().getHeight(), is(greaterThan(
+ smallVH.getPrimaryIcon().getHeight())));
+ }
+
+ @Test
+ public void testLargePrimaryIconHasNoStartMargin() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_LARGE);
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
+ .getMarginStart(), is(equalTo(0)));
+ }
+
+ @Test
+ public void testSmallAndMediumPrimaryIconStartMargin() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item1.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_MEDIUM);
+
+ List<SwitchListItem> items = Arrays.asList(item0, item1);
+ setupPagedListView(items);
+
+ int expected =
+ ApplicationProvider.getApplicationContext().getResources().getDimensionPixelSize(
+ R.dimen.car_keyline_1);
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
+ .getMarginStart(), is(equalTo(expected)));
+
+ viewHolder = getViewHolderAtPosition(1);
+ assertThat(((ViewGroup.MarginLayoutParams) viewHolder.getPrimaryIcon().getLayoutParams())
+ .getMarginStart(), is(equalTo(expected)));
+ }
+
+ @Test
+ public void testSmallPrimaryIconTopMarginRemainsTheSameRegardlessOfTextLength() {
+ final String longText =
+ ApplicationProvider.getApplicationContext().getResources().getString(
+ R.string.over_uxr_text_length_limit);
+
+ // Single line item.
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+ item0.setTitle("one line text");
+
+ // Double line item with one line text.
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item1.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+ item1.setTitle("one line text");
+ item1.setBody("one line text");
+
+ // Double line item with long text.
+ SwitchListItem item2 = new SwitchListItem(mActivity);
+ item2.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+ item2.setTitle("one line text");
+ item2.setBody(longText);
+
+ // Body text only - long text.
+ SwitchListItem item3 = new SwitchListItem(mActivity);
+ item3.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+ item3.setBody(longText);
+
+ // Body text only - one line text.
+ SwitchListItem item4 = new SwitchListItem(mActivity);
+ item4.setPrimaryActionIcon(
+ Icon.createWithResource(mActivity, android.R.drawable.sym_def_app_icon),
+ SwitchListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+ item4.setBody("one line text");
+
+ List<SwitchListItem> items = Arrays.asList(item0, item1, item2, item3, item4);
+ setupPagedListView(items);
+
+ for (int i = 1; i < items.size(); i++) {
+ onView(withId(R.id.recycler_view)).perform(scrollToPosition(i));
+ // Implementation uses integer division so it may be off by 1 vs centered vertically.
+ assertThat((double) getViewHolderAtPosition(i - 1).getPrimaryIcon().getTop(),
+ is(closeTo(
+ (double) getViewHolderAtPosition(i).getPrimaryIcon().getTop(), 1.0d)));
+ }
+ }
+
+ @Test
+ public void testCustomViewBinderBindsLast() {
+ final String updatedTitle = "updated title";
+
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setTitle("original title");
+ item0.addViewBinder((viewHolder) -> viewHolder.getTitle().setText(updatedTitle));
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(viewHolder.getTitle().getText(), is(equalTo(updatedTitle)));
+ }
+
+ @Test
+ public void testCustomViewBinderOnUnusedViewsHasNoEffect() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.addViewBinder((viewHolder) -> viewHolder.getBody().setText("text"));
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(viewHolder.getBody().getVisibility(), is(equalTo(View.GONE)));
+ // Custom binder interacts with body but has no effect.
+ // Expect card height to remain single line.
+ assertThat((double) viewHolder.itemView.getHeight(), is(closeTo(
+ ApplicationProvider.getApplicationContext().getResources().getDimension(
+ R.dimen.car_single_line_list_item_height), 1.0d)));
+ }
+
+ @Test
+ public void testRevertingViewBinder() throws Throwable {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setBody("one item");
+ item0.addViewBinder(
+ (viewHolder) -> viewHolder.getBody().setEllipsize(TextUtils.TruncateAt.END),
+ (viewHolder -> viewHolder.getBody().setEllipsize(null)));
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+
+ // Bind view holder to a new item - the customization made by item0 should be reverted.
+ SwitchListItem item1 = new SwitchListItem(mActivity);
+ item1.setBody("new item");
+ mActivityRule.runOnUiThread(() -> item1.bind(viewHolder));
+
+ assertThat(viewHolder.getBody().getEllipsize(), is(equalTo(null)));
+ }
+
+ @Test
+ public void testRemovingViewBinder() {
+ SwitchListItem item0 = new SwitchListItem(mActivity);
+ item0.setBody("one item");
+ ListItem.ViewBinder<SwitchListItem.ViewHolder> binder =
+ (viewHolder) -> viewHolder.getTitle().setEllipsize(TextUtils.TruncateAt.END);
+ item0.addViewBinder(binder);
+
+ assertTrue(item0.removeViewBinder(binder));
+
+ List<SwitchListItem> items = Arrays.asList(item0);
+ setupPagedListView(items);
+
+ assertThat(getViewHolderAtPosition(0).getBody().getEllipsize(), is(equalTo(null)));
+ }
+
+ @Test
+ public void testUpdateItem() {
+ SwitchListItem item = new SwitchListItem(mActivity);
+ setupPagedListView(Arrays.asList(item));
+
+ String title = "updated title";
+ item.setTitle(title);
+
+ refreshUi();
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertThat(viewHolder.getTitle().getText(), is(equalTo(title)));
+ }
+
+ @Test
+ public void testUxRestrictionsChange() {
+ String longText = mActivity.getString(R.string.over_uxr_text_length_limit);
+ SwitchListItem item = new SwitchListItem(mActivity);
+ item.setBody(longText);
+
+ setupPagedListView(Arrays.asList(item));
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ // Default behavior without UXR is unrestricted.
+ assertThat(viewHolder.getBody().getText(), is(equalTo(longText)));
+
+ viewHolder.onUxRestrictionsChanged(CarUxRestrictionsTestUtils.getFullyRestricted());
+ refreshUi();
+
+ // Verify that the body text length is limited.
+ assertThat(viewHolder.getBody().getText().length(), is(lessThan(longText.length())));
+ }
+
+ @Test
+ public void testUxRestrictionsChangesDoNotAlterExistingInputFilters() {
+ InputFilter filter = new InputFilter.AllCaps(Locale.US);
+ String bodyText = "body_text";
+ SwitchListItem item = new SwitchListItem(mActivity);
+ item.setBody(bodyText);
+ item.addViewBinder(vh -> vh.getBody().setFilters(new InputFilter[] {filter}));
+
+ setupPagedListView(Arrays.asList(item));
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+
+ // Toggle UX restrictions between fully restricted and unrestricted should not affect
+ // existing filters.
+ viewHolder.onUxRestrictionsChanged(CarUxRestrictionsTestUtils.getFullyRestricted());
+ refreshUi();
+ assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter));
+
+ viewHolder.onUxRestrictionsChanged(CarUxRestrictionsTestUtils.getBaseline());
+ refreshUi();
+ assertTrue(Arrays.asList(viewHolder.getBody().getFilters()).contains(filter));
+ }
+
+ @Test
+ public void testDisabledItemDisablesViewHolder() {
+ SwitchListItem item = new SwitchListItem(mActivity);
+ item.setTitle("title");
+ item.setBody("body");
+ item.setEnabled(false);
+
+ setupPagedListView(Arrays.asList(item));
+
+ SwitchListItem.ViewHolder viewHolder = getViewHolderAtPosition(0);
+ assertFalse(viewHolder.getTitle().isEnabled());
+ assertFalse(viewHolder.getBody().isEnabled());
+ assertFalse(viewHolder.getSwitch().isEnabled());
+ }
+
+ @Test
+ public void testDisabledItemDoesNotRespondToClick() {
+ // Disabled view will not respond to touch event.
+ // Current test setup makes it hard to test, since clickChildViewWithId() directly calls
+ // performClick() on a view, bypassing the way UI handles disabled state.
+
+ // We are explicitly setting itemView so test it here.
+ boolean[] clicked = new boolean[]{false};
+ SwitchListItem item = new SwitchListItem(mActivity);
+ item.setEnabled(false);
+
+ setupPagedListView(Arrays.asList(item));
+
+ onView(withId(R.id.recycler_view)).perform(
+ actionOnItemAtPosition(0, click()));
+
+ assertFalse(clicked[0]);
+ }
+
+ private Context getContext() {
+ return mActivity;
+ }
+
+ private void refreshUi() {
+ try {
+ mActivityRule.runOnUiThread(() -> mAdapter.notifyDataSetChanged());
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ throw new RuntimeException(throwable);
+ }
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ }
+
+ private void setupPagedListView(List<SwitchListItem> items) {
+ ListItemProvider provider = new ListItemProvider.ListProvider(new ArrayList<>(items));
+ try {
+ mAdapter = new ListItemAdapter(mActivity, provider);
+ mActivityRule.runOnUiThread(() -> mPagedListView.setAdapter(mAdapter));
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ throw new RuntimeException(throwable);
+ }
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ }
+
+ private SwitchListItem.ViewHolder getViewHolderAtPosition(int position) {
+ return (SwitchListItem.ViewHolder) mPagedListView.getRecyclerView()
+ .findViewHolderForAdapterPosition(position);
+ }
+
+ private void toggleChecked(CompoundButton button) {
+ try {
+ mActivityRule.runOnUiThread(button::toggle);
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ throw new RuntimeException(throwable);
+ }
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ }
+
+ private static ViewAction clickChildViewWithId(final int id) {
+ return new ViewAction() {
+ @Override
+ public Matcher<View> getConstraints() {
+ return null;
+ }
+
+ @Override
+ public String getDescription() {
+ return "Click on a child view with specific id.";
+ }
+
+ @Override
+ public void perform(UiController uiController, View view) {
+ View v = view.findViewById(id);
+ v.performClick();
+ }
+ };
+ }
+}
diff --git a/car/core/src/androidTest/java/androidx/car/widget/TextListItemTest.java b/car/core/src/androidTest/java/androidx/car/widget/TextListItemTest.java
index d26348d..daf37a3 100644
--- a/car/core/src/androidTest/java/androidx/car/widget/TextListItemTest.java
+++ b/car/core/src/androidTest/java/androidx/car/widget/TextListItemTest.java
@@ -920,7 +920,7 @@
}
@Test
- public void testClickInterceptor_ClickableIfSupplmentalIconClickable() {
+ public void testClickInterceptor_ClickableIfSupplementalIconClickable() {
TextListItem item = new TextListItem(mActivity);
item.setEnabled(true);
@@ -934,7 +934,7 @@
}
@Test
- public void testClickInterceptor_VisibleIfSupplmentalIconClickable() {
+ public void testClickInterceptor_VisibleIfSupplementalIconClickable() {
TextListItem item = new TextListItem(mActivity);
item.setEnabled(true);
@@ -948,7 +948,7 @@
}
@Test
- public void testClickInterceptor_NotClickableIfSupplmentalIconNotClickable() {
+ public void testClickInterceptor_NotClickableIfSupplementalIconNotClickable() {
TextListItem item = new TextListItem(mActivity);
item.setEnabled(true);
@@ -962,7 +962,7 @@
}
@Test
- public void testClickInterceptor_GoneIfSupplmentalIconClickable() {
+ public void testClickInterceptor_GoneIfSupplementalIconClickable() {
TextListItem item = new TextListItem(mActivity);
item.setEnabled(true);
diff --git a/car/core/src/main/java/androidx/car/navigation/utils/Bundlable.java b/car/core/src/main/java/androidx/car/navigation/utils/Bundlable.java
index 65e8bf2..d8a2249 100644
--- a/car/core/src/main/java/androidx/car/navigation/utils/Bundlable.java
+++ b/car/core/src/main/java/androidx/car/navigation/utils/Bundlable.java
@@ -16,7 +16,7 @@
package androidx.car.navigation.utils;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
@@ -85,7 +85,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface Bundlable {
/**
* Serializes this object into a {@link BundleMarshaller} by writing all its fields to it.
diff --git a/car/core/src/main/java/androidx/car/navigation/utils/BundleMarshaller.java b/car/core/src/main/java/androidx/car/navigation/utils/BundleMarshaller.java
index 1e6178a..99eb510 100644
--- a/car/core/src/main/java/androidx/car/navigation/utils/BundleMarshaller.java
+++ b/car/core/src/main/java/androidx/car/navigation/utils/BundleMarshaller.java
@@ -16,7 +16,7 @@
package androidx.car.navigation.utils;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
@@ -55,7 +55,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class BundleMarshaller {
/**
* Separator used to concatenate identifiers when marshalling non-primitive types (e.g. lists
diff --git a/car/core/src/main/java/androidx/car/util/CarUxRestrictionsUtils.java b/car/core/src/main/java/androidx/car/util/CarUxRestrictionsUtils.java
index 48f3992..da265ac 100644
--- a/car/core/src/main/java/androidx/car/util/CarUxRestrictionsUtils.java
+++ b/car/core/src/main/java/androidx/car/util/CarUxRestrictionsUtils.java
@@ -16,7 +16,7 @@
package androidx.car.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.text.InputFilter;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class CarUxRestrictionsUtils {
private CarUxRestrictionsUtils() {};
diff --git a/car/core/src/main/java/androidx/car/util/DropShadowScrollListener.java b/car/core/src/main/java/androidx/car/util/DropShadowScrollListener.java
index ec4ef2f..4d3a4fd 100644
--- a/car/core/src/main/java/androidx/car/util/DropShadowScrollListener.java
+++ b/car/core/src/main/java/androidx/car/util/DropShadowScrollListener.java
@@ -36,7 +36,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class DropShadowScrollListener extends PagedListView.OnScrollListener {
private static final String TAG = "DropShadowScrollListener";
private static final int ANIMATION_DURATION_MS = 100;
diff --git a/car/core/src/main/java/androidx/car/util/GridLayoutManagerUtils.java b/car/core/src/main/java/androidx/car/util/GridLayoutManagerUtils.java
index 79652cc..c28053c 100644
--- a/car/core/src/main/java/androidx/car/util/GridLayoutManagerUtils.java
+++ b/car/core/src/main/java/androidx/car/util/GridLayoutManagerUtils.java
@@ -16,7 +16,7 @@
package androidx.car.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.View;
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class GridLayoutManagerUtils {
private GridLayoutManagerUtils() {}
diff --git a/car/core/src/main/java/androidx/car/util/ListItemBackgroundResolver.java b/car/core/src/main/java/androidx/car/util/ListItemBackgroundResolver.java
index 068592b..f26e034 100644
--- a/car/core/src/main/java/androidx/car/util/ListItemBackgroundResolver.java
+++ b/car/core/src/main/java/androidx/car/util/ListItemBackgroundResolver.java
@@ -16,7 +16,7 @@
package androidx.car.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.View;
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ListItemBackgroundResolver {
private ListItemBackgroundResolver() {}
diff --git a/car/core/src/main/java/androidx/car/uxrestrictions/CarUxRestrictions.java b/car/core/src/main/java/androidx/car/uxrestrictions/CarUxRestrictions.java
index a6a88d8..8008597 100644
--- a/car/core/src/main/java/androidx/car/uxrestrictions/CarUxRestrictions.java
+++ b/car/core/src/main/java/androidx/car/uxrestrictions/CarUxRestrictions.java
@@ -16,7 +16,7 @@
package androidx.car.uxrestrictions;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
@@ -146,7 +146,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(flag = true,
value = {UX_RESTRICTIONS_BASELINE,
UX_RESTRICTIONS_NO_DIALPAD,
@@ -344,7 +344,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public CarUxRestrictions(android.car.drivingstate.CarUxRestrictions uxRestrictions) {
mTimestamp = uxRestrictions.getTimeStamp();
mIsDistractionOptimizationRequired = uxRestrictions.isRequiresDistractionOptimization();
diff --git a/car/core/src/main/java/androidx/car/widget/CarToolbar.java b/car/core/src/main/java/androidx/car/widget/CarToolbar.java
index 37723db..225f0f8 100644
--- a/car/core/src/main/java/androidx/car/widget/CarToolbar.java
+++ b/car/core/src/main/java/androidx/car/widget/CarToolbar.java
@@ -40,6 +40,7 @@
import androidx.annotation.Px;
import androidx.annotation.StringRes;
import androidx.annotation.StyleRes;
+import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.car.R;
@@ -76,6 +77,10 @@
*/
public class CarToolbar extends ViewGroup {
+ // Max number of Action items displayed on the toolbar, only applies to IF_ROOM items.
+ @VisibleForTesting
+ static final int ACTION_ITEM_COUNT_LIMIT = 4;
+
private static final String TAG = "CarToolbar";
private final ImageButton mNavButtonView;
@@ -104,8 +109,16 @@
private List<CarMenuItem> mMenuItems;
@Nullable
private CarListDialog mOverflowDialog;
+ private final List<InflatedMenuItem> mAllMenuItems = new ArrayList<>();
private final List<CarMenuItem> mOverflowMenuItems = new ArrayList<>();
- private final List<View> mActionViews = new ArrayList<>();
+ private final List<View> mToolbarItems = new ArrayList<>();
+ // Number of items that are always displayed on the toolbar.
+ private int mAlwaysItemCount;
+
+ // Minimum width required to show a menu item as action item on the toolbar.
+ // This var is used as threshold for showing if_room items, therefore its value is subject
+ // to change - DO NOT depend on it.
+ private final int mMinActionButtonWidth;
/**
* OnClickListener that handles the overflow dialog clicks by calling the appropriate
@@ -154,6 +167,8 @@
mSubtitleTextView = findViewById(R.id.subtitle);
mOverflowButtonView = findViewById(R.id.overflow_menu);
+ mMinActionButtonWidth = res.getDimensionPixelOffset(R.dimen.car_button_min_width);
+
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CarToolbar, defStyleAttr,
/* defStyleRes= */ 0);
try {
@@ -234,6 +249,31 @@
width += navWidth + getHorizontalMargins(mNavButtonView);
}
+ mToolbarItems.forEach(this::removeView);
+ mToolbarItems.clear();
+ mOverflowMenuItems.clear();
+
+ // Measure items that will always be shown on the toolbar.
+ int alwaysItemsWidth = measureAlwaysItems(width, widthMeasureSpec, childHeightMeasureSpec);
+ width += alwaysItemsWidth;
+
+ // Decide how many IF_ROOM items to show, and measure them.
+ width += measureIfRoomItems(width, alwaysItemsWidth, widthMeasureSpec,
+ childHeightMeasureSpec);
+
+ // Split the items appropriately based on the display location.
+ // Done post measurement to ensure the order in the two lists matches the passed-in items.
+ for (InflatedMenuItem inflatedItem : mAllMenuItems) {
+ if (inflatedItem.mIsDisplayedOnToolbar) {
+ mToolbarItems.add(inflatedItem.mView);
+ } else {
+ mOverflowMenuItems.add(inflatedItem.mItem);
+ }
+ }
+
+ // Show the overflow menu button if there are any overflow menu items.
+ mOverflowButtonView.setVisibility(mOverflowMenuItems.isEmpty() ? GONE : VISIBLE);
+
if (mOverflowButtonView.getVisibility() != GONE) {
int measureSpec = MeasureSpec.makeMeasureSpec(mEdgeButtonIconSize, MeasureSpec.EXACTLY);
mOverflowButtonView.measure(measureSpec, measureSpec);
@@ -241,11 +281,6 @@
+ getHorizontalMargins(mOverflowButtonView);
}
- for (View view : mActionViews) {
- measureChild(view, widthMeasureSpec, width, childHeightMeasureSpec, 0);
- width += view.getMeasuredWidth() + getHorizontalMargins(view);
- }
-
if (mTitleIconView.getVisibility() != GONE) {
int measureSpec = MeasureSpec.makeMeasureSpec(mTitleIconSize, MeasureSpec.EXACTLY);
mTitleIconView.measure(measureSpec, measureSpec);
@@ -269,6 +304,74 @@
resolveSize(desiredHeight, heightMeasureSpec));
}
+ /**
+ * Measures ALWAYS menu items and adds them to the layout.
+ *
+ * @param widthUsed Total width used by other child views so far.
+ * @param widthMeasureSpec Parent width measure spec.
+ * @param heightMeasureSpec Parent height measure spec.
+ * @return Total width occupied by ALWAYS items.
+ */
+ private int measureAlwaysItems(int widthUsed, int widthMeasureSpec, int heightMeasureSpec) {
+ int width = 0;
+ for (InflatedMenuItem inflatedItem : mAllMenuItems) {
+ if (inflatedItem.mItem.getDisplayBehavior() == CarMenuItem.DisplayBehavior.ALWAYS) {
+ View action = inflatedItem.mView;
+ measureChild(action, widthMeasureSpec, widthUsed + width, heightMeasureSpec, 0);
+ inflatedItem.mIsDisplayedOnToolbar = true;
+ addView(action);
+
+ width += action.getMeasuredWidth() + getHorizontalMargins(action);
+ }
+ }
+ return width;
+ }
+
+ /**
+ * Measures IF_ROOM menu items and adds them to the layout. Items past
+ * {@link #ACTION_ITEM_COUNT_LIMIT} or half the toolbar width will not be measured/added.
+ *
+ * @param widthUsed Total width used by other child views so far.
+ * @param alwaysItemsWidth Total width used by ALWAYS item views.
+ * @param widthMeasureSpec Parent width measure spec.
+ * @param heightMeasureSpec Parent height measure spec.
+ * @return Total width occupied by IF_ROOM items.
+ */
+ private int measureIfRoomItems(int widthUsed, int alwaysItemsWidth,
+ int widthMeasureSpec, int heightMeasureSpec) {
+ int width = 0;
+
+ // If mode is unspecified, all IF_ROOM items should be measured.
+ boolean isWidthUnspecified =
+ MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED;
+ // If specified, available width for IF_ROOM items. (50% of toolbar)
+ int widthCapacity = (MeasureSpec.getSize(widthMeasureSpec) / 2) - alwaysItemsWidth;
+ // Count of IF_ROOM items to be displayed on the toolbar.
+ int allowedCount = ACTION_ITEM_COUNT_LIMIT - mAlwaysItemCount;
+
+ for (InflatedMenuItem inflatedItem : mAllMenuItems) {
+ if (allowedCount < 1
+ || (!isWidthUnspecified && widthCapacity <= mMinActionButtonWidth)) {
+ // Cannot show more IF_ROOM items because either max count is reached, or remaining
+ // width is not sufficient.
+ break;
+ }
+ if (inflatedItem.mItem.getDisplayBehavior() == CarMenuItem.DisplayBehavior.IF_ROOM) {
+ View action = inflatedItem.mView;
+ measureChild(action, widthMeasureSpec, widthUsed + width, heightMeasureSpec, 0);
+ int viewWidth = action.getMeasuredWidth() + getHorizontalMargins(action);
+ if (isWidthUnspecified || widthCapacity - viewWidth > 0) {
+ allowedCount--;
+ widthCapacity -= viewWidth;
+ width += viewWidth;
+ inflatedItem.mIsDisplayedOnToolbar = true;
+ addView(action);
+ }
+ }
+ }
+ return width;
+ }
+
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int height = bottom - top;
@@ -294,7 +397,7 @@
mOverflowButtonView.getMeasuredWidth());
}
- for (View view : mActionViews) {
+ for (View view : mToolbarItems) {
layoutViewFromRightVerticallyCentered(view, right - layoutRight, height);
layoutRight += view.getMeasuredWidth();
}
@@ -563,35 +666,32 @@
public void setMenuItems(@Nullable List<CarMenuItem> items) {
mMenuItems = items;
- mOverflowMenuItems.clear();
+ mAllMenuItems.clear();
+ mAlwaysItemCount = 0;
- // Remove all old action views from the Layout then the list.
- mActionViews.forEach(this::removeView);
- mActionViews.clear();
-
- List<CarMenuItem> actionItems = new ArrayList<>();
-
- if (mMenuItems != null) {
- for (CarMenuItem item : mMenuItems) {
- if (item.getDisplayBehavior() == CarMenuItem.DisplayBehavior.ALWAYS) {
- actionItems.add(item);
- } else {
- // Treat If-Room items as overflow until that behavior is supported.
- mOverflowMenuItems.add(item);
- }
- }
+ if (mMenuItems == null) {
+ requestLayout();
+ return;
}
- // Show the overflow menu button if there are any overflow menu items.
- mOverflowButtonView.setVisibility(mOverflowMenuItems.isEmpty() ? GONE : VISIBLE);
-
- for (CarMenuItem item : actionItems) {
- View action = item.isCheckable() ? createCheckableAction(item) : createAction(item);
- MarginLayoutParams marginLayoutParams =
- new MarginLayoutParams(LayoutParams.WRAP_CONTENT, mActionButtonHeight);
- action.setLayoutParams(marginLayoutParams);
- mActionViews.add(action);
- addView(action);
+ // Create Views for all ALWAYS and IF_ROOM items.
+ for (CarMenuItem item : mMenuItems) {
+ View action;
+ switch (item.getDisplayBehavior()) {
+ case ALWAYS:
+ mAlwaysItemCount++;
+ // Fall-through
+ case IF_ROOM:
+ action = item.isCheckable() ? createCheckableAction(item) : createAction(item);
+ break;
+ case NEVER:
+ action = null;
+ break;
+ default:
+ throw new IllegalStateException(
+ "Unknown display behavior: " + item.getDisplayBehavior());
+ }
+ mAllMenuItems.add(new InflatedMenuItem(item, action));
}
requestLayout();
}
@@ -614,6 +714,8 @@
private Button createAction(CarMenuItem item) {
Context context = getContext();
Button button = new Button(context, null, 0, item.getStyleResId());
+ button.setLayoutParams(
+ new MarginLayoutParams(LayoutParams.WRAP_CONTENT, mActionButtonHeight));
CharSequence title = item.getTitle();
button.setText(title);
@@ -680,7 +782,7 @@
* Adds the overflow items to the overflow menu dialog.
*/
private void populateOverflowMenu() {
- if (mOverflowMenuItems == null || mOverflowMenuItems.isEmpty()) {
+ if (mOverflowMenuItems.isEmpty()) {
mOverflowDialog = null;
return;
}
@@ -838,4 +940,20 @@
lp.height);
child.measure(childWidthSpec, childHeightSpec);
}
+
+ /**
+ * Class that keeps track of a {@link CarMenuItem} and its inflated {@link View}.
+ */
+ private static class InflatedMenuItem {
+ final CarMenuItem mItem;
+ @Nullable
+ final View mView;
+ boolean mIsDisplayedOnToolbar;
+
+ // |view| is Nullable since overflow items do not have a View associated with them.
+ InflatedMenuItem(@NonNull CarMenuItem item, @Nullable View view) {
+ mItem = item;
+ mView = view;
+ }
+ }
}
diff --git a/car/core/src/main/java/androidx/car/widget/ListItemAdapter.java b/car/core/src/main/java/androidx/car/widget/ListItemAdapter.java
index bbc728b..7c66826 100644
--- a/car/core/src/main/java/androidx/car/widget/ListItemAdapter.java
+++ b/car/core/src/main/java/androidx/car/widget/ListItemAdapter.java
@@ -101,6 +101,7 @@
static final int LIST_ITEM_TYPE_SUBHEADER = 3;
static final int LIST_ITEM_TYPE_ACTION = 4;
static final int LIST_ITEM_TYPE_RADIO = 5;
+ static final int LIST_ITEM_TYPE_SWITCH = 6;
private final SparseIntArray mViewHolderLayoutResIds = new SparseIntArray();
@@ -142,6 +143,8 @@
R.layout.car_list_item_action_content, ActionListItem::createViewHolder);
registerListItemViewTypeInternal(LIST_ITEM_TYPE_RADIO,
R.layout.car_list_item_radio_content, RadioButtonListItem::createViewHolder);
+ registerListItemViewTypeInternal(LIST_ITEM_TYPE_SWITCH,
+ R.layout.car_list_item_switch_content, SwitchListItem::createViewHolder);
mUxRestrictionsHelper =
new CarUxRestrictionsHelper(context, carUxRestrictions -> {
diff --git a/car/core/src/main/java/androidx/car/widget/SwitchListItem.java b/car/core/src/main/java/androidx/car/widget/SwitchListItem.java
new file mode 100644
index 0000000..d0ae858
--- /dev/null
+++ b/car/core/src/main/java/androidx/car/widget/SwitchListItem.java
@@ -0,0 +1,671 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.car.widget;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Icon;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.Switch;
+import android.widget.TextView;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.DimenRes;
+import androidx.annotation.Dimension;
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.R;
+import androidx.car.util.CarUxRestrictionsUtils;
+import androidx.car.uxrestrictions.CarUxRestrictions;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.constraintlayout.widget.Guideline;
+
+import java.lang.annotation.Retention;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to build a list item with {@link Switch}.
+ *
+ * <p>An item supports primary action and a switch as supplemental action.
+ *
+ * <p>An item visually composes of 3 parts; each part may contain multiple views.
+ * <ul>
+ * <li>{@code Primary Action}: represented by an icon of following types.
+ * <ul>
+ * <li>Primary Icon - icon size could be large or small.
+ * <li>No Icon - no icon is shown.
+ * <li>Empty Icon - {@code Text} offsets start space as if there was an icon.
+ * </ul>
+ * <li>{@code Text}: supports any combination of the following text views.
+ * <ul>
+ * <li>Title
+ * <li>Body
+ * </ul>
+ * <li>{@code Supplemental Action}: represented by {@link Switch}.
+ * </ul>
+ *
+ * <p>{@code SwitchListItem} binds data to {@link ViewHolder} based on components selected.
+ *
+ * <p>When conflicting setter methods are called (e.g. setting primary action to both primary icon
+ * and no icon), the last called method wins.
+ */
+public class SwitchListItem extends ListItem<SwitchListItem.ViewHolder> {
+
+ @Retention(SOURCE)
+ @IntDef({
+ PRIMARY_ACTION_ICON_SIZE_SMALL, PRIMARY_ACTION_ICON_SIZE_MEDIUM,
+ PRIMARY_ACTION_ICON_SIZE_LARGE})
+ private @interface PrimaryActionIconSize {}
+
+ /**
+ * Small sized icon is the mostly commonly used size. It's the same as supplemental action icon.
+ */
+ public static final int PRIMARY_ACTION_ICON_SIZE_SMALL = 0;
+ /**
+ * Medium sized icon is slightly bigger than {@code SMALL} ones. It is intended for profile
+ * pictures (avatar), in which case caller is responsible for passing in a circular image.
+ */
+ public static final int PRIMARY_ACTION_ICON_SIZE_MEDIUM = 1;
+ /**
+ * Large sized icon is as tall as a list item with only {@code title} text. It is intended for
+ * album art.
+ */
+ public static final int PRIMARY_ACTION_ICON_SIZE_LARGE = 2;
+
+ @Retention(SOURCE)
+ @IntDef({
+ PRIMARY_ACTION_TYPE_NO_ICON, PRIMARY_ACTION_TYPE_EMPTY_ICON,
+ PRIMARY_ACTION_TYPE_ICON})
+ private @interface PrimaryActionType {}
+
+ private static final int PRIMARY_ACTION_TYPE_NO_ICON = 0;
+ private static final int PRIMARY_ACTION_TYPE_EMPTY_ICON = 1;
+ private static final int PRIMARY_ACTION_TYPE_ICON = 2;
+
+ private final Context mContext;
+ private boolean mIsEnabled = true;
+ private boolean mIsClickable;
+
+ private final List<ViewBinder<ViewHolder>> mBinders = new ArrayList<>();
+
+ @PrimaryActionType private int mPrimaryActionType = PRIMARY_ACTION_TYPE_NO_ICON;
+ private Icon mPrimaryActionIcon;
+ @PrimaryActionIconSize private int mPrimaryActionIconSize = PRIMARY_ACTION_ICON_SIZE_SMALL;
+
+ private CharSequence mTitle;
+ private CharSequence mBody;
+
+ @Dimension
+ private final int mSupplementalGuidelineBegin;
+
+ private boolean mSwitchChecked;
+ /**
+ * {@code true} if the checked state of the switch has changed programmatically and
+ * {@link #mSwitchOnCheckedChangeListener} needs to be notified.
+ */
+ private boolean mShouldNotifySwitchChecked;
+ private boolean mShowSwitchDivider;
+ private CompoundButton.OnCheckedChangeListener mSwitchOnCheckedChangeListener;
+
+ /**
+ * Creates a {@link ViewHolder}.
+ */
+ @NonNull
+ public static ViewHolder createViewHolder(View itemView) {
+ return new ViewHolder(itemView);
+ }
+
+ public SwitchListItem(@NonNull Context context) {
+ mContext = context;
+ mSupplementalGuidelineBegin = mContext.getResources().getDimensionPixelSize(
+ R.dimen.car_list_item_supplemental_guideline_top);
+ markDirty();
+ }
+
+ /**
+ * Used by {@link ListItemAdapter} to choose layout to inflate for view holder.
+ */
+ @Override
+ public int getViewType() {
+ return ListItemAdapter.LIST_ITEM_TYPE_SWITCH;
+ }
+
+ /**
+ * Calculates the layout params for views in {@link ViewHolder}.
+ */
+ @Override
+ @CallSuper
+ protected void resolveDirtyState() {
+ mBinders.clear();
+
+ // Create binders that adjust layout params of each view.
+ setPrimaryAction();
+ setText();
+ setSwitch();
+ setItemClickable();
+ }
+
+ /**
+ * Hides all views in {@link ViewHolder} then applies ViewBinders to adjust view layout params.
+ */
+ @Override
+ public void onBind(ViewHolder viewHolder) {
+ hideSubViews(viewHolder);
+ for (ViewBinder binder : mBinders) {
+ binder.bind(viewHolder);
+ }
+
+ for (View v : viewHolder.getWidgetViews()) {
+ v.setEnabled(mIsEnabled);
+ }
+ // SwitchListItem supports clicking on the item so we also update the entire itemView.
+ viewHolder.itemView.setEnabled(mIsEnabled);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ mIsEnabled = enabled;
+ }
+
+ /**
+ * Sets whether the item is clickable. If {@code true}, clicking item toggles the switch.
+ */
+ public void setClickable(boolean isClickable) {
+ mIsClickable = isClickable;
+ markDirty();
+ }
+
+ /**
+ * Sets {@code Primary Action} to be represented by an icon.
+ *
+ * @param icon An icon to set as primary action.
+ * @param size small/medium/large. Available as {@link #PRIMARY_ACTION_ICON_SIZE_SMALL},
+ * {@link #PRIMARY_ACTION_ICON_SIZE_MEDIUM},
+ * {@link #PRIMARY_ACTION_ICON_SIZE_LARGE}.
+ */
+ public void setPrimaryActionIcon(@NonNull Icon icon, @PrimaryActionIconSize int size) {
+ mPrimaryActionType = PRIMARY_ACTION_TYPE_ICON;
+ mPrimaryActionIcon = icon;
+ mPrimaryActionIconSize = size;
+ markDirty();
+ }
+
+ /**
+ * Sets {@code Primary Action} to be empty icon.
+ *
+ * <p>{@code Text} would have a start margin as if {@code Primary Action} were set to primary
+ * icon.
+ */
+ public void setPrimaryActionEmptyIcon() {
+ mPrimaryActionType = PRIMARY_ACTION_TYPE_EMPTY_ICON;
+ markDirty();
+ }
+
+ /**
+ * Sets {@code Primary Action} to have no icon. Text would align to the start of item.
+ */
+ public void setPrimaryActionNoIcon() {
+ mPrimaryActionType = PRIMARY_ACTION_TYPE_NO_ICON;
+ markDirty();
+ }
+
+ /**
+ * Sets the title of item.
+ *
+ * <p>Primary text is {@code Title} by default. It can be set by
+ * {@link #setBody(CharSequence)}
+ *
+ * <p>{@code Title} text is limited to one line, and ellipses at the end.
+ *
+ * @param title text to display as title.
+ */
+ public void setTitle(@Nullable CharSequence title) {
+ mTitle = title;
+ markDirty();
+ }
+
+ /**
+ * Sets the body text of item.
+ *
+ * <p>Text beyond length required by regulation will be truncated.
+ *
+ * @param body text to be displayed.
+ */
+ public void setBody(@Nullable CharSequence body) {
+ mBody = body;
+ markDirty();
+ }
+
+ /**
+ * Sets the state of {@code Switch}.
+ *
+ * @param isChecked sets the "checked/unchecked, namely on/off" state of switch.
+ */
+ public void setSwitchState(boolean isChecked) {
+ if (mSwitchChecked == isChecked) {
+ return;
+ }
+ mSwitchChecked = isChecked;
+ mShouldNotifySwitchChecked = true;
+ markDirty();
+ }
+
+ /**
+ * Registers a callback to be invoked when the checked state of switch changes.
+ *
+ * @param listener callback to be invoked when the checked state shown in the UI changes.
+ */
+ public void setSwitchOnCheckedChangeListener(
+ @Nullable CompoundButton.OnCheckedChangeListener listener) {
+ mSwitchOnCheckedChangeListener = listener;
+ // This method invalidates previous listener. Reset so that we *only*
+ // notify when the checked state changes and not on the initial bind.
+ mShouldNotifySwitchChecked = false;
+ markDirty();
+ }
+
+ /**
+ * Sets whether to display a vertical bar between switch and text.
+ */
+ public void setShowSwitchDivider(boolean showSwitchDivider) {
+ mShowSwitchDivider = showSwitchDivider;
+ markDirty();
+ }
+
+ @NonNull
+ protected final Context getContext() {
+ return mContext;
+ }
+
+ private void hideSubViews(ViewHolder vh) {
+ for (View v : vh.getWidgetViews()) {
+ v.setVisibility(View.GONE);
+ }
+ }
+
+ private void setPrimaryAction() {
+ setPrimaryIconContent();
+ setPrimaryIconLayout();
+ }
+
+ private void setText() {
+ setTextContent();
+ setTextVerticalMargin();
+ setTextStartMargin();
+ setTextEndMargin();
+ }
+
+ private void setPrimaryIconContent() {
+ switch (mPrimaryActionType) {
+ case PRIMARY_ACTION_TYPE_ICON:
+ mBinders.add(vh -> {
+ vh.getPrimaryIcon().setVisibility(View.VISIBLE);
+ mPrimaryActionIcon.loadDrawableAsync(getContext(),
+ drawable -> vh.getPrimaryIcon().setImageDrawable(drawable),
+ new Handler(Looper.getMainLooper()));
+ });
+ break;
+ case PRIMARY_ACTION_TYPE_EMPTY_ICON:
+ case PRIMARY_ACTION_TYPE_NO_ICON:
+ // Do nothing.
+ break;
+ default:
+ throw new IllegalStateException("Unknown primary action type.");
+ }
+ }
+
+ /**
+ * Sets the size, start margin, and vertical position of primary icon.
+ *
+ * <p>Large icon will have no start margin, and always align center vertically.
+ *
+ * <p>Small/medium icon will have start margin, and uses a top margin such that it is "pinned"
+ * at the same position in list item regardless of item height.
+ */
+ private void setPrimaryIconLayout() {
+ if (mPrimaryActionType == PRIMARY_ACTION_TYPE_EMPTY_ICON
+ || mPrimaryActionType == PRIMARY_ACTION_TYPE_NO_ICON) {
+ return;
+ }
+
+ // Size of icon.
+ @DimenRes int sizeResId;
+ switch (mPrimaryActionIconSize) {
+ case PRIMARY_ACTION_ICON_SIZE_SMALL:
+ sizeResId = R.dimen.car_primary_icon_size;
+ break;
+ case PRIMARY_ACTION_ICON_SIZE_MEDIUM:
+ sizeResId = R.dimen.car_avatar_icon_size;
+ break;
+ case PRIMARY_ACTION_ICON_SIZE_LARGE:
+ sizeResId = R.dimen.car_single_line_list_item_height;
+ break;
+ default:
+ throw new IllegalStateException("Unknown primary action icon size.");
+ }
+
+ int iconSize = mContext.getResources().getDimensionPixelSize(sizeResId);
+
+ // Start margin of icon.
+ int startMargin;
+ switch (mPrimaryActionIconSize) {
+ case PRIMARY_ACTION_ICON_SIZE_SMALL:
+ case PRIMARY_ACTION_ICON_SIZE_MEDIUM:
+ startMargin = mContext.getResources().getDimensionPixelSize(R.dimen.car_keyline_1);
+ break;
+ case PRIMARY_ACTION_ICON_SIZE_LARGE:
+ startMargin = 0;
+ break;
+ default:
+ throw new IllegalStateException("Unknown primary action icon size.");
+ }
+
+ mBinders.add(vh -> {
+ ConstraintLayout.LayoutParams layoutParams =
+ (ConstraintLayout.LayoutParams) vh.getPrimaryIcon().getLayoutParams();
+ layoutParams.height = layoutParams.width = iconSize;
+ layoutParams.setMarginStart(startMargin);
+
+ if (mPrimaryActionIconSize == PRIMARY_ACTION_ICON_SIZE_LARGE) {
+ // A large icon is always vertically centered.
+ layoutParams.verticalBias = 0.5f;
+ layoutParams.topMargin = 0;
+ } else {
+ // Align the icon to the top of the parent. This allows the topMargin to shift it
+ // down relative to the top.
+ layoutParams.verticalBias = 0f;
+
+ // For all other icon sizes, the icon should be centered within the height of
+ // car_double_line_list_item_height. Note: the actual height of the item can be
+ // larger than this.
+ int itemHeight = mContext.getResources().getDimensionPixelSize(
+ R.dimen.car_double_line_list_item_height);
+ layoutParams.topMargin = (itemHeight - iconSize) / 2;
+ }
+
+ vh.getPrimaryIcon().requestLayout();
+ });
+ }
+
+ private void setTextContent() {
+ boolean hasTitle = !TextUtils.isEmpty(mTitle);
+ boolean hasBody = !TextUtils.isEmpty(mBody);
+
+ if (!hasTitle && !hasBody) {
+ return;
+ }
+
+ mBinders.add(vh -> {
+ if (hasTitle) {
+ vh.getTitle().setVisibility(View.VISIBLE);
+ vh.getTitle().setText(mTitle);
+ }
+
+ if (hasBody) {
+ vh.getBody().setVisibility(View.VISIBLE);
+ vh.getBody().setText(mBody);
+ }
+
+ if (hasTitle && !hasBody) {
+ // If only title, then center the supplemental actions.
+ vh.getSupplementalGuideline().setGuidelineBegin(
+ ConstraintLayout.LayoutParams.UNSET);
+ vh.getSupplementalGuideline().setGuidelinePercent(0.5f);
+ } else {
+ // Otherwise, position it a fixed distance from the top.
+ vh.getSupplementalGuideline().setGuidelinePercent(
+ ConstraintLayout.LayoutParams.UNSET);
+ vh.getSupplementalGuideline().setGuidelineBegin(
+ mSupplementalGuidelineBegin);
+ }
+ });
+ }
+
+ /**
+ * Sets start margin of text view depending on icon type.
+ */
+ private void setTextStartMargin() {
+ @DimenRes int startMarginResId;
+ switch (mPrimaryActionType) {
+ case PRIMARY_ACTION_TYPE_NO_ICON:
+ startMarginResId = R.dimen.car_keyline_1;
+ break;
+ case PRIMARY_ACTION_TYPE_EMPTY_ICON:
+ startMarginResId = R.dimen.car_keyline_3;
+ break;
+ case PRIMARY_ACTION_TYPE_ICON:
+ startMarginResId = mPrimaryActionIconSize == PRIMARY_ACTION_ICON_SIZE_LARGE
+ ? R.dimen.car_keyline_4
+ : R.dimen.car_keyline_3; // Small and medium sized icon.
+ break;
+ default:
+ throw new IllegalStateException("Unknown primary action type.");
+ }
+ int startMargin = mContext.getResources().getDimensionPixelSize(startMarginResId);
+ mBinders.add(vh -> {
+ MarginLayoutParams titleLayoutParams =
+ (MarginLayoutParams) vh.getTitle().getLayoutParams();
+ titleLayoutParams.setMarginStart(startMargin);
+ vh.getTitle().requestLayout();
+
+ MarginLayoutParams bodyLayoutParams =
+ (MarginLayoutParams) vh.getBody().getLayoutParams();
+ bodyLayoutParams.setMarginStart(startMargin);
+ vh.getBody().requestLayout();
+ });
+ }
+
+ private void setTextEndMargin() {
+ int endMargin = mContext.getResources().getDimensionPixelSize(R.dimen.car_padding_4);
+
+ mBinders.add(vh -> {
+ MarginLayoutParams titleLayoutParams =
+ (MarginLayoutParams) vh.getTitle().getLayoutParams();
+ titleLayoutParams.setMarginEnd(endMargin);
+
+ MarginLayoutParams bodyLayoutParams =
+ (MarginLayoutParams) vh.getBody().getLayoutParams();
+ bodyLayoutParams.setMarginEnd(endMargin);
+ });
+ }
+
+ /**
+ * Sets top/bottom margins of {@code Title} and {@code Body}.
+ */
+ private void setTextVerticalMargin() {
+ // Set all relevant fields in layout params to avoid carried over params when the item
+ // gets bound to a recycled view holder.
+ if (!TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mBody)) {
+ // Title only - view is aligned center vertically by itself.
+ mBinders.add(vh -> {
+ MarginLayoutParams layoutParams =
+ (MarginLayoutParams) vh.getTitle().getLayoutParams();
+ layoutParams.topMargin = 0;
+ vh.getTitle().requestLayout();
+ });
+ } else if (TextUtils.isEmpty(mTitle) && !TextUtils.isEmpty(mBody)) {
+ mBinders.add(vh -> {
+ // Body uses top and bottom margin.
+ int margin = mContext.getResources().getDimensionPixelSize(
+ R.dimen.car_padding_3);
+ MarginLayoutParams layoutParams =
+ (MarginLayoutParams) vh.getBody().getLayoutParams();
+ layoutParams.topMargin = margin;
+ layoutParams.bottomMargin = margin;
+ vh.getBody().requestLayout();
+ });
+ } else {
+ mBinders.add(vh -> {
+ Resources resources = mContext.getResources();
+ int padding2 = resources.getDimensionPixelSize(R.dimen.car_padding_2);
+
+ // Title has a top margin
+ MarginLayoutParams titleLayoutParams =
+ (MarginLayoutParams) vh.getTitle().getLayoutParams();
+ titleLayoutParams.topMargin = padding2;
+ vh.getTitle().requestLayout();
+
+ // Body is below title with no margin and has bottom margin.
+ MarginLayoutParams bodyLayoutParams =
+ (MarginLayoutParams) vh.getBody().getLayoutParams();
+ bodyLayoutParams.topMargin = 0;
+ bodyLayoutParams.bottomMargin = padding2;
+ vh.getBody().requestLayout();
+ });
+ }
+ }
+
+ /**
+ * Sets up view(s) for supplemental action.
+ */
+ private void setSwitch() {
+ mBinders.add(vh -> {
+ vh.getSwitch().setVisibility(View.VISIBLE);
+ vh.getSwitch().setOnCheckedChangeListener(null);
+ vh.getSwitch().setChecked(mSwitchChecked);
+ vh.getSwitch().setOnCheckedChangeListener((buttonView, isChecked) -> {
+ if (mSwitchOnCheckedChangeListener != null) {
+ // The checked state changed via user interaction with the switch.
+ mSwitchOnCheckedChangeListener.onCheckedChanged(buttonView, isChecked);
+ }
+ mSwitchChecked = isChecked;
+ });
+ if (mShouldNotifySwitchChecked && mSwitchOnCheckedChangeListener != null) {
+ // The checked state was changed programmatically.
+ mSwitchOnCheckedChangeListener.onCheckedChanged(vh.getSwitch(),
+ mSwitchChecked);
+ mShouldNotifySwitchChecked = false;
+ }
+
+ if (mShowSwitchDivider) {
+ vh.getSwitchDivider().setVisibility(View.VISIBLE);
+ }
+ });
+ }
+
+ private void setItemClickable() {
+ mBinders.add(vh -> {
+ // If applicable (namely item is clickable), clicking item always toggles the switch.
+ vh.itemView.setOnClickListener(v -> vh.getSwitch().toggle());
+ vh.itemView.setClickable(mIsClickable);
+ });
+ }
+
+ /**
+ * Holds views of SwitchListItem.
+ */
+ public static final class ViewHolder extends ListItem.ViewHolder {
+
+ private final View[] mWidgetViews;
+
+ private ImageView mPrimaryIcon;
+
+ private TextView mTitle;
+ private TextView mBody;
+
+ private Guideline mSupplementalGuideline;
+
+ private Switch mSwitch;
+ private View mSwitchDivider;
+
+ /**
+ * ViewHolder that contains necessary widgets for {@link SwitchListItem}.
+ */
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+
+ mPrimaryIcon = itemView.findViewById(R.id.primary_icon);
+
+ mTitle = itemView.findViewById(R.id.title);
+ mBody = itemView.findViewById(R.id.body);
+
+ mSupplementalGuideline = itemView.findViewById(R.id.supplemental_actions_guideline);
+
+ mSwitch = itemView.findViewById(R.id.switch_widget);
+ mSwitchDivider = itemView.findViewById(R.id.switch_divider);
+
+ int minTouchSize = itemView.getContext().getResources()
+ .getDimensionPixelSize(R.dimen.car_touch_target_size);
+ MinTouchTargetHelper.ensureThat(mSwitch).hasMinTouchSize(minTouchSize);
+
+ // Each line groups relevant child views in an effort to help keep this view array
+ // updated with actual child views in the ViewHolder.
+ mWidgetViews = new View[] {
+ mPrimaryIcon,
+ mTitle, mBody,
+ mSwitch, mSwitchDivider,
+ };
+ }
+
+ /**
+ * Updates child views with current car UX restrictions.
+ *
+ * <p>{@code Text} might be truncated to meet length limit required by regulation.
+ *
+ * @param restrictionsInfo current car UX restrictions.
+ */
+ @Override
+ public void onUxRestrictionsChanged(CarUxRestrictions restrictionsInfo) {
+ CarUxRestrictionsUtils.apply(itemView.getContext(), restrictionsInfo, getBody());
+ }
+
+ @NonNull
+ public ImageView getPrimaryIcon() {
+ return mPrimaryIcon;
+ }
+
+ @NonNull
+ public TextView getTitle() {
+ return mTitle;
+ }
+
+ @NonNull
+ public TextView getBody() {
+ return mBody;
+ }
+
+ @NonNull
+ public View getSwitchDivider() {
+ return mSwitchDivider;
+ }
+
+ @NonNull
+ public Switch getSwitch() {
+ return mSwitch;
+ }
+
+ @NonNull
+ Guideline getSupplementalGuideline() {
+ return mSupplementalGuideline;
+ }
+
+ @NonNull
+ View[] getWidgetViews() {
+ return mWidgetViews;
+ }
+ }
+}
diff --git a/car/core/src/main/java/androidx/car/widget/TextListItem.java b/car/core/src/main/java/androidx/car/widget/TextListItem.java
index 1702fbf..1b35a1e 100644
--- a/car/core/src/main/java/androidx/car/widget/TextListItem.java
+++ b/car/core/src/main/java/androidx/car/widget/TextListItem.java
@@ -663,7 +663,6 @@
markDirty();
}
-
/**
* Sets {@code Supplemental Action} to be represented by an {@code Supplemental Icon}.
*
@@ -738,7 +737,10 @@
* @param checked initial value for switched.
* @param showDivider whether to display a vertical bar between switch and text.
* @param listener callback to be invoked when the checked state shown in the UI changes.
+ *
+ * @deprecated Use {@link SwitchListItem} instead.
*/
+ @Deprecated
public void setSwitch(boolean checked, boolean showDivider,
CompoundButton.OnCheckedChangeListener listener) {
mSupplementalActionType = SUPPLEMENTAL_ACTION_SWITCH;
@@ -759,7 +761,10 @@
* first to set {@code Supplemental Action} as a {@code Switch}.
*
* @param isChecked sets the "checked/unchecked, namely on/off" state of switch.
+ *
+ * @deprecated Use {@link SwitchListItem} instead.
*/
+ @Deprecated
public void setSwitchState(boolean isChecked) {
if (mSwitchChecked == isChecked) {
return;
diff --git a/car/core/src/main/java/androidx/car/widget/itemdecorators/BottomOffsetDecoration.java b/car/core/src/main/java/androidx/car/widget/itemdecorators/BottomOffsetDecoration.java
index 81b8dbb..407835a 100644
--- a/car/core/src/main/java/androidx/car/widget/itemdecorators/BottomOffsetDecoration.java
+++ b/car/core/src/main/java/androidx/car/widget/itemdecorators/BottomOffsetDecoration.java
@@ -16,7 +16,7 @@
package androidx.car.widget.itemdecorators;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.view.View;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class BottomOffsetDecoration extends RecyclerView.ItemDecoration {
private int mBottomOffset;
diff --git a/car/core/src/main/java/androidx/car/widget/itemdecorators/DividerDecoration.java b/car/core/src/main/java/androidx/car/widget/itemdecorators/DividerDecoration.java
index 7a971ad..705fded 100644
--- a/car/core/src/main/java/androidx/car/widget/itemdecorators/DividerDecoration.java
+++ b/car/core/src/main/java/androidx/car/widget/itemdecorators/DividerDecoration.java
@@ -16,7 +16,7 @@
package androidx.car.widget.itemdecorators;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Canvas;
@@ -39,7 +39,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class DividerDecoration extends RecyclerView.ItemDecoration {
public static final int INVALID_RESOURCE_ID = -1;
diff --git a/car/core/src/main/java/androidx/car/widget/itemdecorators/ItemSpacingDecoration.java b/car/core/src/main/java/androidx/car/widget/itemdecorators/ItemSpacingDecoration.java
index 5c35395..aa1b10d 100644
--- a/car/core/src/main/java/androidx/car/widget/itemdecorators/ItemSpacingDecoration.java
+++ b/car/core/src/main/java/androidx/car/widget/itemdecorators/ItemSpacingDecoration.java
@@ -16,7 +16,7 @@
package androidx.car.widget.itemdecorators;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.view.View;
@@ -31,7 +31,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ItemSpacingDecoration extends RecyclerView.ItemDecoration {
private int mItemSpacing;
diff --git a/car/core/src/main/java/androidx/car/widget/itemdecorators/TopOffsetDecoration.java b/car/core/src/main/java/androidx/car/widget/itemdecorators/TopOffsetDecoration.java
index 0e49957..35805fc 100644
--- a/car/core/src/main/java/androidx/car/widget/itemdecorators/TopOffsetDecoration.java
+++ b/car/core/src/main/java/androidx/car/widget/itemdecorators/TopOffsetDecoration.java
@@ -16,7 +16,7 @@
package androidx.car.widget.itemdecorators;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.view.View;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TopOffsetDecoration extends RecyclerView.ItemDecoration {
private int mTopOffset;
diff --git a/car/core/src/main/res/layout/car_tab_view.xml b/car/core/src/main/res/layout/car_tab_view.xml
new file mode 100644
index 0000000..edf57cd
--- /dev/null
+++ b/car/core/src/main/res/layout/car_tab_view.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<!-- A custom view meant to be used in a TabLayout. This tab's icon and text are light-colored for
+ adding on top of a dark background. -->
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/car_tab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="@dimen/car_tab_min_width">
+
+ <!-- Need to use android:id/icon because TabLayout looks for this. -->
+ <ImageView
+ android:id="@android:id/icon"
+ android:scaleType="fitCenter"
+ android:layout_width="@dimen/car_secondary_icon_size"
+ android:layout_height="@dimen/car_secondary_icon_size"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:tint="@color/car_tab_tint" />
+
+ <!-- Need to use android:id/text1 because TabLayout looks for this. -->
+ <TextView
+ android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/car_padding_0"
+ android:layout_below="@android:id/icon"
+ android:layout_centerHorizontal="true"
+ android:maxLines="1"
+ android:textColor="@color/car_tab_tint"
+ android:textAppearance="@style/TextAppearance.Car.Body4.Medium.Light" />
+</RelativeLayout>
diff --git a/cardview/api/1.1.0-alpha01.txt b/cardview/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..49fbb11
--- /dev/null
+++ b/cardview/api/1.1.0-alpha01.txt
@@ -0,0 +1,29 @@
+// Signature format: 3.0
+package androidx.cardview.widget {
+
+ public class CardView extends android.widget.FrameLayout {
+ ctor public CardView(android.content.Context);
+ ctor public CardView(android.content.Context, android.util.AttributeSet?);
+ ctor public CardView(android.content.Context, android.util.AttributeSet?, int);
+ method public android.content.res.ColorStateList getCardBackgroundColor();
+ method public float getCardElevation();
+ method @Px public int getContentPaddingBottom();
+ method @Px public int getContentPaddingLeft();
+ method @Px public int getContentPaddingRight();
+ method @Px public int getContentPaddingTop();
+ method public float getMaxCardElevation();
+ method public boolean getPreventCornerOverlap();
+ method public float getRadius();
+ method public boolean getUseCompatPadding();
+ method public void setCardBackgroundColor(@ColorInt int);
+ method public void setCardBackgroundColor(android.content.res.ColorStateList?);
+ method public void setCardElevation(float);
+ method public void setContentPadding(@Px int, @Px int, @Px int, @Px int);
+ method public void setMaxCardElevation(float);
+ method public void setPreventCornerOverlap(boolean);
+ method public void setRadius(float);
+ method public void setUseCompatPadding(boolean);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/cardview/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to cardview/api/res-1.1.0-alpha01.txt
diff --git a/collection/api/1.1.0-alpha03.txt b/collection/api/1.1.0-alpha03.txt
new file mode 100644
index 0000000..179d17f
--- /dev/null
+++ b/collection/api/1.1.0-alpha03.txt
@@ -0,0 +1,183 @@
+// Signature format: 3.0
+package androidx.collection {
+
+ public class ArrayMap<K, V> extends androidx.collection.SimpleArrayMap<K,V> implements java.util.Map<K,V> {
+ ctor public ArrayMap();
+ ctor public ArrayMap(int);
+ ctor public ArrayMap(androidx.collection.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<E> java.util.Set<E> {
+ ctor public ArraySet();
+ ctor public ArraySet(int);
+ ctor public ArraySet(androidx.collection.ArraySet<E>?);
+ ctor public ArraySet(java.util.Collection<E>?);
+ method public boolean add(E?);
+ method public void addAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean addAll(java.util.Collection<? extends E>);
+ method public void clear();
+ method public boolean contains(Object?);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public void ensureCapacity(int);
+ method public int indexOf(Object?);
+ method public boolean isEmpty();
+ method public java.util.Iterator<E>! iterator();
+ method public boolean remove(Object?);
+ method public boolean removeAll(androidx.collection.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 Object[] toArray();
+ method public <T> T[] toArray(T[]);
+ method public E? valueAt(int);
+ }
+
+ 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 androidx.collection.LongSparseArray<E>! clone();
+ method public boolean containsKey(long);
+ method public boolean containsValue(E!);
+ method @Deprecated 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 putAll(androidx.collection.LongSparseArray<? extends E>);
+ method public E? putIfAbsent(long, E!);
+ method public void remove(long);
+ method public boolean remove(long, Object!);
+ method public void removeAt(int);
+ method public E? replace(long, E!);
+ method public boolean replace(long, E!, E!);
+ 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 int createCount();
+ method protected void entryRemoved(boolean, K, V, V?);
+ method public final void evictAll();
+ method public final int evictionCount();
+ method public final V? get(K);
+ method public final int hitCount();
+ method public final int maxSize();
+ method public final int missCount();
+ method public final V? put(K, V);
+ method public final int putCount();
+ method public final V? remove(K);
+ method public void resize(int);
+ method public final int size();
+ method protected int sizeOf(K, V);
+ method public final java.util.Map<K,V>! snapshot();
+ method public final String toString();
+ method public void trimToSize(int);
+ }
+
+ public class SimpleArrayMap<K, V> {
+ ctor public SimpleArrayMap();
+ ctor public SimpleArrayMap(int);
+ ctor public SimpleArrayMap(androidx.collection.SimpleArrayMap<K,V>!);
+ method public void clear();
+ method public boolean containsKey(Object?);
+ method public boolean containsValue(Object!);
+ method public void ensureCapacity(int);
+ method public V? get(Object!);
+ method public V! getOrDefault(Object!, V!);
+ method public int indexOfKey(Object?);
+ method public boolean isEmpty();
+ method public K! keyAt(int);
+ method public V? put(K!, V!);
+ method public void putAll(androidx.collection.SimpleArrayMap<? extends K,? extends V>);
+ method public V? putIfAbsent(K!, V!);
+ method public V? remove(Object!);
+ method public boolean remove(Object!, Object!);
+ method public V! removeAt(int);
+ method public V? replace(K!, V!);
+ method public boolean replace(K!, V!, V!);
+ 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 androidx.collection.SparseArrayCompat<E>! clone();
+ method public boolean containsKey(int);
+ method public boolean containsValue(E!);
+ method @Deprecated 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 putAll(androidx.collection.SparseArrayCompat<? extends E>);
+ method public E? putIfAbsent(int, E!);
+ method public void remove(int);
+ method public boolean remove(int, Object!);
+ method public void removeAt(int);
+ method public void removeAtRange(int, int);
+ method public E? replace(int, E!);
+ method public boolean replace(int, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+}
+
diff --git a/collection/build.gradle b/collection/build.gradle
index 4bc2d3a..11fac32 100644
--- a/collection/build.gradle
+++ b/collection/build.gradle
@@ -23,7 +23,7 @@
}
dependencies {
- compile("androidx.annotation:annotation:1.0.0")
+ compile(project(":annotation"))
annotationProcessor(NULLAWAY)
testCompile(JUNIT)
}
diff --git a/collection/ktx/api/1.1.0-alpha03.txt b/collection/ktx/api/1.1.0-alpha03.txt
new file mode 100644
index 0000000..3fe6a36
--- /dev/null
+++ b/collection/ktx/api/1.1.0-alpha03.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.collection {
+
+ public final class ArrayMapKt {
+ ctor public ArrayMapKt();
+ method public static inline <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf();
+ method public static <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+ }
+
+ public final class ArraySetKt {
+ ctor public ArraySetKt();
+ method public static inline <T> androidx.collection.ArraySet<T> arraySetOf();
+ method public static <T> androidx.collection.ArraySet<T> arraySetOf(T... values);
+ }
+
+ public final class LongSparseArrayKt {
+ ctor public LongSparseArrayKt();
+ method public static inline operator <T> boolean contains(androidx.collection.LongSparseArray<T>, long key);
+ method public static inline <T> void forEach(androidx.collection.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.LongSparseArray<T>, long key, T! defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.LongSparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
+ method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
+ method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+ method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T! value);
+ method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T! value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ ctor public LruCacheKt();
+ method public static inline <K, V> androidx.collection.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ -> });
+ }
+
+ public final class SparseArrayKt {
+ ctor public SparseArrayKt();
+ method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
+ method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.SparseArrayCompat<T>, int key, T! defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.SparseArrayCompat<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.SparseArrayCompat<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
+ method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+ method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T! value);
+ method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T! value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
+ }
+
+}
+
diff --git a/collection/src/main/java/androidx/collection/ArraySet.java b/collection/src/main/java/androidx/collection/ArraySet.java
index 60ca0b9..7963bbc 100644
--- a/collection/src/main/java/androidx/collection/ArraySet.java
+++ b/collection/src/main/java/androidx/collection/ArraySet.java
@@ -16,7 +16,7 @@
package androidx.collection;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -410,7 +410,7 @@
* The array must already be large enough to contain the item.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void append(E value) {
final int index = mSize;
final int hash = value == null ? 0 : value.hashCode();
diff --git a/content/api/1.1.0-alpha01.txt b/content/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..b5241ef
--- /dev/null
+++ b/content/api/1.1.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.contentpager.content {
+
+ public class ContentPager {
+ ctor public ContentPager(android.content.ContentResolver!, androidx.contentpager.content.ContentPager.QueryRunner!);
+ ctor public ContentPager(android.content.ContentResolver, androidx.contentpager.content.ContentPager.QueryRunner, int);
+ method public static android.os.Bundle createArgs(int, int);
+ method @MainThread public androidx.contentpager.content.Query query(@RequiresPermission.Read android.net.Uri, String[]?, android.os.Bundle, android.os.CancellationSignal?, androidx.contentpager.content.ContentPager.ContentCallback);
+ method @MainThread public void reset();
+ field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+ field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+ field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+ field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+ field public static final String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+ field public static final String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+ field public static final String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+ field public static final String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+ field public static final String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ }
+
+ public static interface ContentPager.ContentCallback {
+ method @MainThread public void onCursorReady(androidx.contentpager.content.Query, android.database.Cursor?);
+ }
+
+ @IntDef({androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_COPIED, androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_PAGED, androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_REPAGED, androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_WRAPPED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentPager.CursorDisposition {
+ }
+
+ public static interface ContentPager.QueryRunner {
+ method public void cancel(androidx.contentpager.content.Query);
+ method public boolean isRunning(androidx.contentpager.content.Query);
+ method public void query(androidx.contentpager.content.Query, androidx.contentpager.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public static interface ContentPager.QueryRunner.Callback {
+ method public void onQueryFinished(androidx.contentpager.content.Query, android.database.Cursor?);
+ method public android.database.Cursor? runQueryInBackground(androidx.contentpager.content.Query);
+ }
+
+ public final class LoaderQueryRunner implements androidx.contentpager.content.ContentPager.QueryRunner {
+ ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+ method public void cancel(androidx.contentpager.content.Query);
+ method public boolean isRunning(androidx.contentpager.content.Query);
+ method public void query(androidx.contentpager.content.Query, androidx.contentpager.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public final class Query {
+ method public int getId();
+ method public int getLimit();
+ method public int getOffset();
+ method public android.net.Uri getUri();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/content/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to content/api/res-1.1.0-alpha01.txt
diff --git a/coordinatorlayout/build.gradle b/coordinatorlayout/build.gradle
index f4fb3a0..7bbacfd 100644
--- a/coordinatorlayout/build.gradle
+++ b/coordinatorlayout/build.gradle
@@ -7,7 +7,7 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":annotation"))
// TODO: change to 1.1.0-alpha04 after release
api(project(":core"))
implementation("androidx.collection:collection:1.0.0")
diff --git a/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java b/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
index 50dd925..16bbdcc 100644
--- a/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
+++ b/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
@@ -16,7 +16,7 @@
package androidx.coordinatorlayout.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -143,7 +143,7 @@
static final int EVENT_VIEW_REMOVED = 2;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef({EVENT_PRE_DRAW, EVENT_NESTED_SCROLL, EVENT_VIEW_REMOVED})
public @interface DispatchChangeEvent {}
@@ -379,7 +379,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final WindowInsetsCompat getLastWindowInsets() {
return mLastInsets;
}
diff --git a/core/api/1.1.0-alpha04.txt b/core/api/1.1.0-alpha04.txt
index 715d405..e9cfd20 100644
--- a/core/api/1.1.0-alpha04.txt
+++ b/core/api/1.1.0-alpha04.txt
@@ -1136,6 +1136,14 @@
}
+package androidx.core.location {
+
+ public final class LocationManagerCompat {
+ method public static boolean isLocationEnabled(android.location.LocationManager);
+ }
+
+}
+
package androidx.core.math {
public class MathUtils {
diff --git a/core/api/1.1.0-alpha05.txt b/core/api/1.1.0-alpha05.txt
new file mode 100644
index 0000000..0ece2e3
--- /dev/null
+++ b/core/api/1.1.0-alpha05.txt
@@ -0,0 +1,2943 @@
+// Signature format: 3.0
+package androidx.core.accessibilityservice {
+
+ public final class AccessibilityServiceInfoCompat {
+ method public static String capabilityToString(int);
+ method public static String feedbackTypeToString(int);
+ method public static String? flagToString(int);
+ method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+ method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+ field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+ field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+ field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+ field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+ field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+ field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+ field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+ }
+
+}
+
+package androidx.core.app {
+
+ public class ActivityCompat extends androidx.core.content.ContextCompat {
+ ctor protected ActivityCompat();
+ method public static void finishAffinity(android.app.Activity);
+ method public static void finishAfterTransition(android.app.Activity);
+ method public static android.net.Uri? getReferrer(android.app.Activity);
+ method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+ method public static void postponeEnterTransition(android.app.Activity);
+ method public static void recreate(android.app.Activity);
+ method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+ method public static void requestPermissions(android.app.Activity, String[], @IntRange(from=0) int);
+ method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+ method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+ method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+ method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+ method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public static void startPostponedEnterTransition(android.app.Activity);
+ }
+
+ public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+ method public void onRequestPermissionsResult(int, String[], int[]);
+ }
+
+ public static interface ActivityCompat.PermissionCompatDelegate {
+ method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+ method public boolean requestPermissions(android.app.Activity, String[], @IntRange(from=0) int);
+ }
+
+ public final class ActivityManagerCompat {
+ method public static boolean isLowRamDevice(android.app.ActivityManager);
+ }
+
+ public class ActivityOptionsCompat {
+ ctor protected ActivityOptionsCompat();
+ method public android.graphics.Rect? getLaunchBounds();
+ method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+ method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View,java.lang.String>...!);
+ method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+ method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+ method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+ method public android.os.Bundle? toBundle();
+ method public void update(androidx.core.app.ActivityOptionsCompat);
+ field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+ field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+ }
+
+ public final class AlarmManagerCompat {
+ method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+ method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ }
+
+ @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+ ctor public AppComponentFactory();
+ method public final android.app.Activity! instantiateActivity(ClassLoader!, String!, android.content.Intent!) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Application! instantiateApplication(ClassLoader!, String!) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.ContentProvider! instantiateProvider(ClassLoader!, String!) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.BroadcastReceiver! instantiateReceiver(ClassLoader!, String!, android.content.Intent!) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Service! instantiateService(ClassLoader!, String!, android.content.Intent!) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public class AppLaunchChecker {
+ ctor @Deprecated public AppLaunchChecker();
+ method public static boolean hasStartedFromLauncher(android.content.Context);
+ method public static void onActivityCreate(android.app.Activity);
+ }
+
+ public final class AppOpsManagerCompat {
+ method public static int noteOp(android.content.Context, String, int, String);
+ method public static int noteOpNoThrow(android.content.Context, String, int, String);
+ method public static int noteProxyOp(android.content.Context, String, String);
+ method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+ method public static String? permissionToOp(String);
+ field public static final int MODE_ALLOWED = 0; // 0x0
+ field public static final int MODE_DEFAULT = 3; // 0x3
+ field public static final int MODE_ERRORED = 2; // 0x2
+ field public static final int MODE_IGNORED = 1; // 0x1
+ }
+
+ public final class BundleCompat {
+ method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+ method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+ }
+
+ public class DialogCompat {
+ method public static android.view.View requireViewById(android.app.Dialog, int);
+ }
+
+ public class FrameMetricsAggregator {
+ ctor public FrameMetricsAggregator();
+ ctor public FrameMetricsAggregator(int);
+ method public void add(android.app.Activity);
+ method public android.util.SparseIntArray[]? getMetrics();
+ method public android.util.SparseIntArray[]? remove(android.app.Activity);
+ method public android.util.SparseIntArray[]? reset();
+ method public android.util.SparseIntArray[]? stop();
+ field public static final int ANIMATION_DURATION = 256; // 0x100
+ field public static final int ANIMATION_INDEX = 8; // 0x8
+ field public static final int COMMAND_DURATION = 32; // 0x20
+ field public static final int COMMAND_INDEX = 5; // 0x5
+ field public static final int DELAY_DURATION = 128; // 0x80
+ field public static final int DELAY_INDEX = 7; // 0x7
+ field public static final int DRAW_DURATION = 8; // 0x8
+ field public static final int DRAW_INDEX = 3; // 0x3
+ field public static final int EVERY_DURATION = 511; // 0x1ff
+ field public static final int INPUT_DURATION = 2; // 0x2
+ field public static final int INPUT_INDEX = 1; // 0x1
+ field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+ field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+ field public static final int SWAP_DURATION = 64; // 0x40
+ field public static final int SWAP_INDEX = 6; // 0x6
+ field public static final int SYNC_DURATION = 16; // 0x10
+ field public static final int SYNC_INDEX = 4; // 0x4
+ field public static final int TOTAL_DURATION = 1; // 0x1
+ field public static final int TOTAL_INDEX = 0; // 0x0
+ }
+
+ public abstract class JobIntentService extends android.app.Service {
+ ctor public JobIntentService();
+ method public static void enqueueWork(android.content.Context, Class, int, android.content.Intent);
+ method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+ method public boolean isStopped();
+ method public android.os.IBinder! onBind(android.content.Intent);
+ method protected abstract void onHandleWork(android.content.Intent);
+ method public boolean onStopCurrentWork();
+ method public void setInterruptIfStopped(boolean);
+ }
+
+ public final class NavUtils {
+ method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static String? getParentActivityName(android.app.Activity);
+ method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void navigateUpFromSameTask(android.app.Activity);
+ method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+ method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+ field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+ }
+
+ public class NotificationCompat {
+ ctor @Deprecated public NotificationCompat();
+ method public static androidx.core.app.NotificationCompat.Action! getAction(android.app.Notification!, int);
+ method public static int getActionCount(android.app.Notification!);
+ method public static int getBadgeIconType(android.app.Notification!);
+ method public static String! getCategory(android.app.Notification!);
+ method public static String! getChannelId(android.app.Notification!);
+ method @RequiresApi(19) public static CharSequence! getContentTitle(android.app.Notification!);
+ method public static android.os.Bundle? getExtras(android.app.Notification!);
+ method public static String! getGroup(android.app.Notification!);
+ method public static int getGroupAlertBehavior(android.app.Notification!);
+ method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action>! getInvisibleActions(android.app.Notification!);
+ method public static boolean getLocalOnly(android.app.Notification!);
+ method public static String! getShortcutId(android.app.Notification!);
+ method public static String! getSortKey(android.app.Notification!);
+ method public static long getTimeoutAfter(android.app.Notification!);
+ method public static boolean isGroupSummary(android.app.Notification!);
+ field public static final int BADGE_ICON_LARGE = 2; // 0x2
+ field public static final int BADGE_ICON_NONE = 0; // 0x0
+ field public static final int BADGE_ICON_SMALL = 1; // 0x1
+ field public static final String CATEGORY_ALARM = "alarm";
+ field public static final String CATEGORY_CALL = "call";
+ field public static final String CATEGORY_EMAIL = "email";
+ field public static final String CATEGORY_ERROR = "err";
+ field public static final String CATEGORY_EVENT = "event";
+ field public static final String CATEGORY_MESSAGE = "msg";
+ field public static final String CATEGORY_NAVIGATION = "navigation";
+ field public static final String CATEGORY_PROGRESS = "progress";
+ field public static final String CATEGORY_PROMO = "promo";
+ field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+ field public static final String CATEGORY_REMINDER = "reminder";
+ field public static final String CATEGORY_SERVICE = "service";
+ field public static final String CATEGORY_SOCIAL = "social";
+ field public static final String CATEGORY_STATUS = "status";
+ field public static final String CATEGORY_SYSTEM = "sys";
+ field public static final String CATEGORY_TRANSPORT = "transport";
+ field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+ field public static final int DEFAULT_ALL = -1; // 0xffffffff
+ field public static final int DEFAULT_LIGHTS = 4; // 0x4
+ field public static final int DEFAULT_SOUND = 1; // 0x1
+ field public static final int DEFAULT_VIBRATE = 2; // 0x2
+ field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+ field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+ field public static final String EXTRA_BIG_TEXT = "android.bigText";
+ field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+ field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+ field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+ field public static final String EXTRA_INFO_TEXT = "android.infoText";
+ field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+ field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+ field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+ field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+ field public static final String EXTRA_MESSAGES = "android.messages";
+ field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+ field public static final String EXTRA_PEOPLE = "android.people";
+ field public static final String EXTRA_PICTURE = "android.picture";
+ field public static final String EXTRA_PROGRESS = "android.progress";
+ field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+ field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+ field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+ field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+ field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+ field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+ field public static final String EXTRA_SMALL_ICON = "android.icon";
+ field public static final String EXTRA_SUB_TEXT = "android.subText";
+ field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+ field public static final String EXTRA_TEMPLATE = "android.template";
+ field public static final String EXTRA_TEXT = "android.text";
+ field public static final String EXTRA_TEXT_LINES = "android.textLines";
+ field public static final String EXTRA_TITLE = "android.title";
+ field public static final String EXTRA_TITLE_BIG = "android.title.big";
+ field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+ field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+ field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+ field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+ field public static final int FLAG_INSISTENT = 4; // 0x4
+ field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+ field public static final int FLAG_NO_CLEAR = 32; // 0x20
+ field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+ field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+ field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+ field public static final int PRIORITY_DEFAULT = 0; // 0x0
+ field public static final int PRIORITY_HIGH = 1; // 0x1
+ field public static final int PRIORITY_LOW = -1; // 0xffffffff
+ field public static final int PRIORITY_MAX = 2; // 0x2
+ field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+ field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+ field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+ field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+ field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+ }
+
+ public static class NotificationCompat.Action {
+ ctor public NotificationCompat.Action(int, CharSequence!, android.app.PendingIntent!);
+ method public android.app.PendingIntent! getActionIntent();
+ method public boolean getAllowGeneratedReplies();
+ method public androidx.core.app.RemoteInput[]! getDataOnlyRemoteInputs();
+ method public android.os.Bundle! getExtras();
+ method public int getIcon();
+ method public androidx.core.app.RemoteInput[]! getRemoteInputs();
+ method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+ method public boolean getShowsUserInterface();
+ method public 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
+ field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+ field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+ field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+ field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+ field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+ field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+ field public android.app.PendingIntent! actionIntent;
+ field public int icon;
+ field public CharSequence! title;
+ }
+
+ public static final class NotificationCompat.Action.Builder {
+ ctor public NotificationCompat.Action.Builder(int, CharSequence!, android.app.PendingIntent!);
+ ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action!);
+ method public androidx.core.app.NotificationCompat.Action.Builder! addExtras(android.os.Bundle!);
+ method public androidx.core.app.NotificationCompat.Action.Builder! addRemoteInput(androidx.core.app.RemoteInput!);
+ method public androidx.core.app.NotificationCompat.Action! build();
+ method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Extender!);
+ method public android.os.Bundle! getExtras();
+ method public androidx.core.app.NotificationCompat.Action.Builder! setAllowGeneratedReplies(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder! setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+ method public androidx.core.app.NotificationCompat.Action.Builder! setShowsUserInterface(boolean);
+ }
+
+ public static interface NotificationCompat.Action.Extender {
+ method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+ }
+
+ public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+ ctor public NotificationCompat.Action.WearableExtender();
+ ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action!);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender! clone();
+ method public androidx.core.app.NotificationCompat.Action.Builder! extend(androidx.core.app.NotificationCompat.Action.Builder!);
+ method @Deprecated public CharSequence! getCancelLabel();
+ method @Deprecated public CharSequence! getConfirmLabel();
+ method public boolean getHintDisplayActionInline();
+ method public boolean getHintLaunchesActivity();
+ method @Deprecated public CharSequence! getInProgressLabel();
+ method public boolean isAvailableOffline();
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender! setAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setCancelLabel(CharSequence!);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setConfirmLabel(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintDisplayActionInline(boolean);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender! setHintLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender! setInProgressLabel(CharSequence!);
+ }
+
+ public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigPictureStyle();
+ ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder!);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle! bigLargeIcon(android.graphics.Bitmap!);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle! bigPicture(android.graphics.Bitmap!);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle! setBigContentTitle(CharSequence!);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle! setSummaryText(CharSequence!);
+ }
+
+ public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigTextStyle();
+ ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder!);
+ method public androidx.core.app.NotificationCompat.BigTextStyle! bigText(CharSequence!);
+ method public androidx.core.app.NotificationCompat.BigTextStyle! setBigContentTitle(CharSequence!);
+ method public androidx.core.app.NotificationCompat.BigTextStyle! setSummaryText(CharSequence!);
+ }
+
+ public static class NotificationCompat.Builder {
+ ctor public NotificationCompat.Builder(android.content.Context, String);
+ ctor @Deprecated public NotificationCompat.Builder(android.content.Context!);
+ method public androidx.core.app.NotificationCompat.Builder! addAction(int, CharSequence!, android.app.PendingIntent!);
+ method public androidx.core.app.NotificationCompat.Builder! addAction(androidx.core.app.NotificationCompat.Action!);
+ method public androidx.core.app.NotificationCompat.Builder! addExtras(android.os.Bundle!);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(int, CharSequence!, android.app.PendingIntent!);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder! addInvisibleAction(androidx.core.app.NotificationCompat.Action!);
+ method public androidx.core.app.NotificationCompat.Builder! addPerson(String!);
+ method public android.app.Notification! build();
+ method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Extender!);
+ method public android.os.Bundle! getExtras();
+ method @Deprecated public android.app.Notification! getNotification();
+ method protected static CharSequence! limitCharSequenceLength(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Builder! setAutoCancel(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setBadgeIconType(int);
+ method public androidx.core.app.NotificationCompat.Builder! setCategory(String!);
+ method public androidx.core.app.NotificationCompat.Builder! setChannelId(String);
+ method public androidx.core.app.NotificationCompat.Builder! setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.Builder! setColorized(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setContent(android.widget.RemoteViews!);
+ method public androidx.core.app.NotificationCompat.Builder! setContentInfo(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Builder! setContentIntent(android.app.PendingIntent!);
+ method public androidx.core.app.NotificationCompat.Builder! setContentText(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Builder! setContentTitle(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Builder! setCustomBigContentView(android.widget.RemoteViews!);
+ method public androidx.core.app.NotificationCompat.Builder! setCustomContentView(android.widget.RemoteViews!);
+ method public androidx.core.app.NotificationCompat.Builder! setCustomHeadsUpContentView(android.widget.RemoteViews!);
+ method public androidx.core.app.NotificationCompat.Builder! setDefaults(int);
+ method public androidx.core.app.NotificationCompat.Builder! setDeleteIntent(android.app.PendingIntent!);
+ method public androidx.core.app.NotificationCompat.Builder! setExtras(android.os.Bundle!);
+ method public androidx.core.app.NotificationCompat.Builder! setFullScreenIntent(android.app.PendingIntent!, boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setGroup(String!);
+ method public androidx.core.app.NotificationCompat.Builder! setGroupAlertBehavior(int);
+ method public androidx.core.app.NotificationCompat.Builder! setGroupSummary(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setLargeIcon(android.graphics.Bitmap!);
+ method public androidx.core.app.NotificationCompat.Builder! setLights(@ColorInt int, int, int);
+ method public androidx.core.app.NotificationCompat.Builder! setLocalOnly(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setNumber(int);
+ method public androidx.core.app.NotificationCompat.Builder! setOngoing(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setOnlyAlertOnce(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setPriority(int);
+ method public androidx.core.app.NotificationCompat.Builder! setProgress(int, int, boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setPublicVersion(android.app.Notification!);
+ method public androidx.core.app.NotificationCompat.Builder! setRemoteInputHistory(CharSequence[]!);
+ method public androidx.core.app.NotificationCompat.Builder! setShortcutId(String!);
+ method public androidx.core.app.NotificationCompat.Builder! setShowWhen(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int);
+ method public androidx.core.app.NotificationCompat.Builder! setSmallIcon(int, int);
+ method public androidx.core.app.NotificationCompat.Builder! setSortKey(String!);
+ method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!);
+ method public androidx.core.app.NotificationCompat.Builder! setSound(android.net.Uri!, int);
+ method public androidx.core.app.NotificationCompat.Builder! setStyle(androidx.core.app.NotificationCompat.Style!);
+ method public androidx.core.app.NotificationCompat.Builder! setSubText(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!);
+ method public androidx.core.app.NotificationCompat.Builder! setTicker(CharSequence!, android.widget.RemoteViews!);
+ method public androidx.core.app.NotificationCompat.Builder! setTimeoutAfter(long);
+ method public androidx.core.app.NotificationCompat.Builder! setUsesChronometer(boolean);
+ method public androidx.core.app.NotificationCompat.Builder! setVibrate(long[]!);
+ method public androidx.core.app.NotificationCompat.Builder! setVisibility(int);
+ method public androidx.core.app.NotificationCompat.Builder! setWhen(long);
+ field @Deprecated public java.util.ArrayList<java.lang.String>! mPeople;
+ }
+
+ public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.CarExtender();
+ ctor public NotificationCompat.CarExtender(android.app.Notification!);
+ method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+ method @ColorInt public int getColor();
+ method public android.graphics.Bitmap! getLargeIcon();
+ method public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! getUnreadConversation();
+ method public androidx.core.app.NotificationCompat.CarExtender! setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.CarExtender! setLargeIcon(android.graphics.Bitmap!);
+ method public androidx.core.app.NotificationCompat.CarExtender! setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation!);
+ }
+
+ public static class NotificationCompat.CarExtender.UnreadConversation {
+ method public long getLatestTimestamp();
+ method public String[]! getMessages();
+ method public String! getParticipant();
+ method public String[]! getParticipants();
+ method public android.app.PendingIntent! getReadPendingIntent();
+ method public androidx.core.app.RemoteInput! getRemoteInput();
+ method public android.app.PendingIntent! getReplyPendingIntent();
+ }
+
+ public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+ ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(String!);
+ method public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! addMessage(String!);
+ method public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation! build();
+ method public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setLatestTimestamp(long);
+ method public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReadPendingIntent(android.app.PendingIntent!);
+ method public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder! setReplyAction(android.app.PendingIntent!, androidx.core.app.RemoteInput!);
+ }
+
+ public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.DecoratedCustomViewStyle();
+ }
+
+ public static interface NotificationCompat.Extender {
+ method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+ }
+
+ public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.InboxStyle();
+ ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder!);
+ method public androidx.core.app.NotificationCompat.InboxStyle! addLine(CharSequence!);
+ method public androidx.core.app.NotificationCompat.InboxStyle! setBigContentTitle(CharSequence!);
+ method public androidx.core.app.NotificationCompat.InboxStyle! setSummaryText(CharSequence!);
+ }
+
+ public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+ ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+ method public void addCompatExtras(android.os.Bundle!);
+ method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, CharSequence!);
+ method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(CharSequence!, long, androidx.core.app.Person!);
+ method public androidx.core.app.NotificationCompat.MessagingStyle! addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message!);
+ method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification!);
+ method public CharSequence? getConversationTitle();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message>! getMessages();
+ method public androidx.core.app.Person! getUser();
+ method @Deprecated public CharSequence! getUserDisplayName();
+ method public boolean isGroupConversation();
+ method public androidx.core.app.NotificationCompat.MessagingStyle! setConversationTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle! setGroupConversation(boolean);
+ field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+ }
+
+ public static final class NotificationCompat.MessagingStyle.Message {
+ ctor public NotificationCompat.MessagingStyle.Message(CharSequence!, long, androidx.core.app.Person?);
+ ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence!, long, CharSequence!);
+ method public String? getDataMimeType();
+ method public android.net.Uri? getDataUri();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.Person? getPerson();
+ method @Deprecated public CharSequence? getSender();
+ method public CharSequence getText();
+ method public long getTimestamp();
+ method public androidx.core.app.NotificationCompat.MessagingStyle.Message! setData(String!, android.net.Uri!);
+ }
+
+ public abstract static class NotificationCompat.Style {
+ ctor public NotificationCompat.Style();
+ method public android.app.Notification! build();
+ method public void setBuilder(androidx.core.app.NotificationCompat.Builder!);
+ }
+
+ public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.WearableExtender();
+ ctor public NotificationCompat.WearableExtender(android.app.Notification!);
+ method public androidx.core.app.NotificationCompat.WearableExtender! addAction(androidx.core.app.NotificationCompat.Action!);
+ method public androidx.core.app.NotificationCompat.WearableExtender! addActions(java.util.List<androidx.core.app.NotificationCompat.Action>!);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPage(android.app.Notification!);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! addPages(java.util.List<android.app.Notification>!);
+ method public androidx.core.app.NotificationCompat.WearableExtender! clearActions();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! clearPages();
+ method public androidx.core.app.NotificationCompat.WearableExtender! clone();
+ method public androidx.core.app.NotificationCompat.Builder! extend(androidx.core.app.NotificationCompat.Builder!);
+ method public java.util.List<androidx.core.app.NotificationCompat.Action>! getActions();
+ method @Deprecated public android.graphics.Bitmap! getBackground();
+ method public String! getBridgeTag();
+ method public int getContentAction();
+ method @Deprecated public int getContentIcon();
+ method @Deprecated public int getContentIconGravity();
+ method public boolean getContentIntentAvailableOffline();
+ method @Deprecated public int getCustomContentHeight();
+ method @Deprecated public int getCustomSizePreset();
+ method public String! getDismissalId();
+ method @Deprecated public android.app.PendingIntent! getDisplayIntent();
+ method @Deprecated public int getGravity();
+ method @Deprecated public boolean getHintAmbientBigPicture();
+ method @Deprecated public boolean getHintAvoidBackgroundClipping();
+ method public boolean getHintContentIntentLaunchesActivity();
+ method @Deprecated public boolean getHintHideIcon();
+ method @Deprecated public int getHintScreenTimeout();
+ method @Deprecated public boolean getHintShowBackgroundOnly();
+ method @Deprecated public java.util.List<android.app.Notification>! getPages();
+ method public boolean getStartScrollBottom();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setBackground(android.graphics.Bitmap!);
+ method public androidx.core.app.NotificationCompat.WearableExtender! setBridgeTag(String!);
+ method public androidx.core.app.NotificationCompat.WearableExtender! setContentAction(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIcon(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setContentIconGravity(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender! setContentIntentAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomContentHeight(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setCustomSizePreset(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender! setDismissalId(String!);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setDisplayIntent(android.app.PendingIntent!);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setGravity(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAmbientBigPicture(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintAvoidBackgroundClipping(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender! setHintContentIntentLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintHideIcon(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintScreenTimeout(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender! setHintShowBackgroundOnly(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender! setStartScrollBottom(boolean);
+ field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+ field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+ field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+ field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+ field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+ field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+ field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+ field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+ }
+
+ public final class NotificationCompatExtras {
+ field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+ field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+ field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+ field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+ field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+ field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+ }
+
+ public abstract class NotificationCompatSideChannelService extends android.app.Service {
+ ctor public NotificationCompatSideChannelService();
+ method public abstract void cancel(String!, int, String!);
+ method public abstract void cancelAll(String!);
+ method public abstract void notify(String!, int, String!, android.app.Notification!);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ }
+
+ public final class NotificationManagerCompat {
+ method public boolean areNotificationsEnabled();
+ method public void cancel(int);
+ method public void cancel(String?, int);
+ method public void cancelAll();
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+ method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup>);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel>);
+ method public void deleteNotificationChannel(String);
+ method public void deleteNotificationChannelGroup(String);
+ method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+ method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
+ method public int getImportance();
+ method public android.app.NotificationChannel? getNotificationChannel(String);
+ method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+ method public java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups();
+ method public java.util.List<android.app.NotificationChannel> getNotificationChannels();
+ method public void notify(int, android.app.Notification);
+ method public void notify(String?, int, android.app.Notification);
+ field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+ field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+ field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+ field public static final int IMPORTANCE_HIGH = 4; // 0x4
+ field public static final int IMPORTANCE_LOW = 2; // 0x2
+ field public static final int IMPORTANCE_MAX = 5; // 0x5
+ field public static final int IMPORTANCE_MIN = 1; // 0x1
+ field public static final int IMPORTANCE_NONE = 0; // 0x0
+ field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+ }
+
+ public class Person {
+ method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public String? getKey();
+ method public CharSequence? getName();
+ method public String? getUri();
+ method public boolean isBot();
+ method public boolean isImportant();
+ method public androidx.core.app.Person.Builder toBuilder();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static class Person.Builder {
+ ctor public Person.Builder();
+ method public androidx.core.app.Person build();
+ method public androidx.core.app.Person.Builder setBot(boolean);
+ method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+ method public androidx.core.app.Person.Builder setImportant(boolean);
+ method public androidx.core.app.Person.Builder setKey(String?);
+ method public androidx.core.app.Person.Builder setName(CharSequence?);
+ method public androidx.core.app.Person.Builder setUri(String?);
+ }
+
+ public final class RemoteActionCompat {
+ ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+ ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+ method public static androidx.core.app.RemoteActionCompat createFromBundle(android.os.Bundle);
+ method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+ method public android.app.PendingIntent getActionIntent();
+ method public CharSequence getContentDescription();
+ method public androidx.core.graphics.drawable.IconCompat getIcon();
+ method public CharSequence getTitle();
+ method public boolean isEnabled();
+ method public void setEnabled(boolean);
+ method public void setShouldShowIcon(boolean);
+ method public boolean shouldShowIcon();
+ method public android.os.Bundle toBundle();
+ method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+ }
+
+ public final class RemoteInput {
+ method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String,android.net.Uri>!);
+ method public static void addResultsToIntent(androidx.core.app.RemoteInput[]!, android.content.Intent!, android.os.Bundle!);
+ method public boolean getAllowFreeFormInput();
+ method public java.util.Set<java.lang.String>! getAllowedDataTypes();
+ method public CharSequence[]! getChoices();
+ method public static java.util.Map<java.lang.String,android.net.Uri>! getDataResultsFromIntent(android.content.Intent!, String!);
+ method public android.os.Bundle! getExtras();
+ method public CharSequence! getLabel();
+ method public String! getResultKey();
+ method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+ method public static int getResultsSource(android.content.Intent);
+ method public boolean isDataOnly();
+ method public static void setResultsSource(android.content.Intent, int);
+ field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+ field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+ field public static final int SOURCE_CHOICE = 1; // 0x1
+ field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+ }
+
+ public static final class RemoteInput.Builder {
+ ctor public RemoteInput.Builder(String);
+ method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+ method public androidx.core.app.RemoteInput build();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+ method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+ method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence[]?);
+ method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+ }
+
+ public final class ServiceCompat {
+ method public static void stopForeground(android.app.Service, int);
+ field public static final int START_STICKY = 1; // 0x1
+ field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+ field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+ }
+
+ public final class ShareCompat {
+ method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
+ method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
+ method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
+ method public static String! getCallingPackage(android.app.Activity!);
+ field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+ }
+
+ public static class ShareCompat.IntentBuilder {
+ method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! addEmailBcc(String[]!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! addEmailCc(String[]!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! addEmailTo(String[]!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! addStream(android.net.Uri!);
+ method public android.content.Intent! createChooserIntent();
+ method public static androidx.core.app.ShareCompat.IntentBuilder! from(android.app.Activity!);
+ method public android.content.Intent! getIntent();
+ method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(CharSequence!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setChooserTitle(@StringRes int);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setEmailBcc(String[]!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setEmailCc(String[]!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setEmailTo(String[]!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setHtmlText(String!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setStream(android.net.Uri!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setSubject(String!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setText(CharSequence!);
+ method public androidx.core.app.ShareCompat.IntentBuilder! setType(String!);
+ method public void startChooser();
+ }
+
+ public static class ShareCompat.IntentReader {
+ method public static androidx.core.app.ShareCompat.IntentReader! from(android.app.Activity!);
+ method public android.content.ComponentName! getCallingActivity();
+ method public android.graphics.drawable.Drawable! getCallingActivityIcon();
+ method public android.graphics.drawable.Drawable! getCallingApplicationIcon();
+ method public CharSequence! getCallingApplicationLabel();
+ method public String! getCallingPackage();
+ method public String[]! getEmailBcc();
+ method public String[]! getEmailCc();
+ method public String[]! getEmailTo();
+ method public String! getHtmlText();
+ method public android.net.Uri! getStream();
+ method public android.net.Uri! getStream(int);
+ method public int getStreamCount();
+ method public String! getSubject();
+ method public CharSequence! getText();
+ method public String! getType();
+ method public boolean isMultipleShare();
+ method public boolean isShareIntent();
+ method public boolean isSingleShare();
+ }
+
+ public abstract class SharedElementCallback {
+ ctor public SharedElementCallback();
+ method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+ method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+ method public void onMapSharedElements(java.util.List<java.lang.String>!, java.util.Map<java.lang.String,android.view.View>!);
+ method public void onRejectSharedElements(java.util.List<android.view.View>!);
+ method public void onSharedElementEnd(java.util.List<java.lang.String>!, java.util.List<android.view.View>!, java.util.List<android.view.View>!);
+ method public void onSharedElementStart(java.util.List<java.lang.String>!, java.util.List<android.view.View>!, java.util.List<android.view.View>!);
+ method public void onSharedElementsArrived(java.util.List<java.lang.String>!, java.util.List<android.view.View>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+ }
+
+ public static interface SharedElementCallback.OnSharedElementsReadyListener {
+ method public void onSharedElementsReady();
+ }
+
+ public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+ method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+ method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+ method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+ method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+ method public android.content.Intent? editIntentAt(int);
+ method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+ method @Deprecated public android.content.Intent! getIntent(int);
+ method public int getIntentCount();
+ method public android.content.Intent[] getIntents();
+ method public android.app.PendingIntent? getPendingIntent(int, int);
+ method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+ method @Deprecated public java.util.Iterator<android.content.Intent>! iterator();
+ method public void startActivities();
+ method public void startActivities(android.os.Bundle?);
+ }
+
+ public static interface TaskStackBuilder.SupportParentable {
+ method public android.content.Intent? getSupportParentActivityIntent();
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentResolverCompat {
+ method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String[]!, String!, String[]!, String!, androidx.core.os.CancellationSignal!);
+ }
+
+ public class ContextCompat {
+ ctor protected ContextCompat();
+ method public static int checkSelfPermission(android.content.Context, String);
+ method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+ method public static java.io.File! getCodeCacheDir(android.content.Context);
+ method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+ method public static java.io.File? getDataDir(android.content.Context);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ method public static java.io.File[] getExternalCacheDirs(android.content.Context);
+ method public static java.io.File[] getExternalFilesDirs(android.content.Context, String?);
+ method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+ method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+ method public static java.io.File[] getObbDirs(android.content.Context);
+ method public static <T> T? getSystemService(android.content.Context, Class<T>);
+ method public static String? getSystemServiceName(android.content.Context, Class<?>);
+ method public static boolean isDeviceProtectedStorage(android.content.Context);
+ method public static boolean startActivities(android.content.Context, android.content.Intent[]);
+ method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle?);
+ method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+ method public static void startForegroundService(android.content.Context, android.content.Intent);
+ }
+
+ public class FileProvider extends android.content.ContentProvider {
+ ctor public FileProvider();
+ method public int delete(android.net.Uri, String?, String[]?);
+ method public String! getType(android.net.Uri);
+ method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+ method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+ method public boolean onCreate();
+ method public android.database.Cursor! query(android.net.Uri, String[]?, String?, String[]?, String?);
+ method public int update(android.net.Uri, android.content.ContentValues!, String?, String[]?);
+ }
+
+ public final class IntentCompat {
+ method public static android.content.Intent makeMainSelectorActivity(String, String);
+ field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+ field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+ field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+ }
+
+ public final class MimeTypeFilter {
+ method public static boolean matches(String?, String);
+ method public static String? matches(String?, String[]);
+ method public static String? matches(String[]?, String);
+ method public static String[] matchesMany(String[]?, String);
+ }
+
+ public final class PermissionChecker {
+ method public static int checkCallingOrSelfPermission(android.content.Context, String);
+ method public static int checkCallingPermission(android.content.Context, String, String?);
+ method public static int checkPermission(android.content.Context, String, int, int, String?);
+ method public static int checkSelfPermission(android.content.Context, String);
+ field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+ field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+ field public static final int PERMISSION_GRANTED = 0; // 0x0
+ }
+
+ @Deprecated public final class SharedPreferencesCompat {
+ }
+
+ @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+ method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+ method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+ }
+
+}
+
+package androidx.core.content.pm {
+
+ @Deprecated public final class ActivityInfoCompat {
+ field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+ }
+
+ public final class PackageInfoCompat {
+ method public static long getLongVersionCode(android.content.pm.PackageInfo);
+ }
+
+ public final class PermissionInfoCompat {
+ method public static int getProtection(android.content.pm.PermissionInfo);
+ method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+ }
+
+ public class ShortcutInfoCompat {
+ method public android.content.ComponentName? getActivity();
+ method public java.util.Set<java.lang.String>? getCategories();
+ method public CharSequence? getDisabledMessage();
+ method public String getId();
+ method public android.content.Intent getIntent();
+ method public android.content.Intent[] getIntents();
+ method public CharSequence? getLongLabel();
+ method public CharSequence getShortLabel();
+ method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+ }
+
+ public static class ShortcutInfoCompat.Builder {
+ ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+ method public androidx.core.content.pm.ShortcutInfoCompat build();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String>);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent[]);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person[]);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+ }
+
+ public class ShortcutManagerCompat {
+ method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat>);
+ method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat> getDynamicShortcuts(android.content.Context);
+ method public static int getMaxShortcutCountPerActivity(android.content.Context);
+ method public static boolean isRequestPinShortcutSupported(android.content.Context);
+ method public static void removeAllDynamicShortcuts(android.content.Context);
+ method public void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String>);
+ method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+ method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat>);
+ field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class ConfigurationHelper {
+ method public static int getDensityDpi(android.content.res.Resources);
+ }
+
+ public final class ResourcesCompat {
+ method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static float getFloat(android.content.res.Resources, @DimenRes int);
+ method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+ }
+
+ public abstract static class ResourcesCompat.FontCallback {
+ ctor public ResourcesCompat.FontCallback();
+ method public abstract void onFontRetrievalFailed(int);
+ method public abstract void onFontRetrieved(android.graphics.Typeface);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorWindowCompat {
+ method public static android.database.CursorWindow create(String?, long);
+ }
+
+ @Deprecated public final class DatabaseUtilsCompat {
+ method @Deprecated public static String[]! appendSelectionArgs(String[]!, String[]!);
+ method @Deprecated public static String! concatenateWhere(String!, String!);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteCursorCompat {
+ method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapCompat {
+ method public static int getAllocationByteCount(android.graphics.Bitmap);
+ method public static boolean hasMipMap(android.graphics.Bitmap);
+ method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+ }
+
+ public final class ColorUtils {
+ method @ColorInt public static int HSLToColor(float[]);
+ method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+ method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+ method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+ method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+ method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+ method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+ method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+ method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+ method public static double calculateContrast(@ColorInt int, @ColorInt int);
+ method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+ method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+ method public static void colorToHSL(@ColorInt int, float[]);
+ method public static void colorToLAB(@ColorInt int, double[]);
+ method public static void colorToXYZ(@ColorInt int, double[]);
+ method public static int compositeColors(@ColorInt int, @ColorInt int);
+ method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+ method public static double distanceEuclidean(double[], double[]);
+ method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+ }
+
+ public final class PaintCompat {
+ method public static boolean hasGlyph(android.graphics.Paint, String);
+ }
+
+ public final class PathSegment {
+ ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+ method public android.graphics.PointF getEnd();
+ method public float getEndFraction();
+ method public android.graphics.PointF getStart();
+ method public float getStartFraction();
+ }
+
+ public final class PathUtils {
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment> flatten(android.graphics.Path);
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, @FloatRange(from=0) float);
+ }
+
+ public class TypefaceCompat {
+ method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class DrawableCompat {
+ method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+ method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+ method public static void clearColorFilter(android.graphics.drawable.Drawable);
+ method public static int getAlpha(android.graphics.drawable.Drawable);
+ method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+ method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+ method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+ method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+ method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+ method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+ method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+ method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+ method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+ method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+ method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+ method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+ method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+ }
+
+ public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+ method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+ method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+ method @IdRes public int getResId();
+ method public String getResPackage();
+ method public int getType();
+ method public android.net.Uri getUri();
+ method public android.graphics.drawable.Drawable! loadDrawable(android.content.Context!);
+ method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+ method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+ method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+ method public android.os.Bundle! toBundle();
+ method @RequiresApi(23) public android.graphics.drawable.Icon! toIcon();
+ field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+ }
+
+ public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.Bitmap? getBitmap();
+ method public float getCornerRadius();
+ method public int getGravity();
+ method public int getOpacity();
+ method public final android.graphics.Paint getPaint();
+ method public boolean hasAntiAlias();
+ method public boolean hasMipMap();
+ method public boolean isCircular();
+ method public void setAlpha(int);
+ method public void setAntiAlias(boolean);
+ method public void setCircular(boolean);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setCornerRadius(float);
+ method public void setDither(boolean);
+ method public void setGravity(int);
+ method public void setMipMap(boolean);
+ method public void setTargetDensity(android.graphics.Canvas);
+ method public void setTargetDensity(android.util.DisplayMetrics);
+ method public void setTargetDensity(int);
+ }
+
+ public final class RoundedBitmapDrawableFactory {
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+ }
+
+}
+
+package androidx.core.hardware.display {
+
+ public final class DisplayManagerCompat {
+ method public android.view.Display? getDisplay(int);
+ method public android.view.Display[] getDisplays();
+ method public android.view.Display[] getDisplays(String?);
+ method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+ field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+ }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+ @Deprecated public final class FingerprintManagerCompat {
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+ method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+ }
+
+ @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+ method @Deprecated public void onAuthenticationError(int, CharSequence!);
+ method @Deprecated public void onAuthenticationFailed();
+ method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+ method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+ }
+
+ @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+ method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+ }
+
+ @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+ method @Deprecated public javax.crypto.Cipher? getCipher();
+ method @Deprecated public javax.crypto.Mac? getMac();
+ method @Deprecated public java.security.Signature? getSignature();
+ }
+
+}
+
+package androidx.core.location {
+
+ public final class LocationManagerCompat {
+ method public static boolean isLocationEnabled(android.location.LocationManager);
+ }
+
+}
+
+package androidx.core.math {
+
+ public class MathUtils {
+ method public static float clamp(float, float, float);
+ method public static double clamp(double, double, double);
+ method public static int clamp(int, int, int);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class ConnectivityManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+ method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+ }
+
+ public final class TrafficStatsCompat {
+ method @Deprecated public static void clearThreadStatsTag();
+ method @Deprecated public static int getThreadStatsTag();
+ method @Deprecated public static void incrementOperationCount(int);
+ method @Deprecated public static void incrementOperationCount(int, int);
+ method @Deprecated public static void setThreadStatsTag(int);
+ method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+ method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+ }
+
+}
+
+package androidx.core.os {
+
+ public class BuildCompat {
+ method @Deprecated public static boolean isAtLeastN();
+ method @Deprecated public static boolean isAtLeastNMR1();
+ method @Deprecated public static boolean isAtLeastO();
+ method @Deprecated public static boolean isAtLeastOMR1();
+ method @Deprecated public static boolean isAtLeastP();
+ method public static boolean isAtLeastQ();
+ }
+
+ public final class CancellationSignal {
+ ctor public CancellationSignal();
+ method public void cancel();
+ method public Object? getCancellationSignalObject();
+ method public boolean isCanceled();
+ method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+ method public void throwIfCanceled();
+ }
+
+ public static interface CancellationSignal.OnCancelListener {
+ method public void onCancel();
+ }
+
+ public final class ConfigurationCompat {
+ method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+ }
+
+ public final class EnvironmentCompat {
+ method public static String! getStorageState(java.io.File);
+ field public static final String MEDIA_UNKNOWN = "unknown";
+ }
+
+ public final class HandlerCompat {
+ method public static android.os.Handler createAsync(android.os.Looper);
+ method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+ method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+ }
+
+ public final class LocaleListCompat {
+ method public static androidx.core.os.LocaleListCompat create(java.util.Locale...);
+ method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+ method public java.util.Locale! get(int);
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+ method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+ method public java.util.Locale? getFirstMatch(String[]);
+ method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+ method public boolean isEmpty();
+ method @IntRange(from=0) public int size();
+ method public String toLanguageTags();
+ method public Object? unwrap();
+ method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+ method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+ }
+
+ public final class MessageCompat {
+ method public static boolean isAsynchronous(android.os.Message);
+ method public static void setAsynchronous(android.os.Message, boolean);
+ }
+
+ public class OperationCanceledException extends java.lang.RuntimeException {
+ ctor public OperationCanceledException();
+ ctor public OperationCanceledException(String?);
+ }
+
+ public final class ParcelCompat {
+ method public static boolean readBoolean(android.os.Parcel);
+ method public static void writeBoolean(android.os.Parcel, boolean);
+ }
+
+ @Deprecated public final class ParcelableCompat {
+ method @Deprecated public static <T> android.os.Parcelable.Creator<T>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T>!);
+ }
+
+ @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+ method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+ method @Deprecated public T[]! newArray(int);
+ }
+
+ public final class TraceCompat {
+ method public static void beginSection(String);
+ method public static void endSection();
+ }
+
+ public class UserManagerCompat {
+ method public static boolean isUserUnlocked(android.content.Context);
+ }
+
+}
+
+package androidx.core.provider {
+
+ public final class FontRequest {
+ ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]>>);
+ ctor public FontRequest(String, String, String, @ArrayRes int);
+ method public java.util.List<java.util.List<byte[]>>? getCertificates();
+ method @ArrayRes public int getCertificatesArrayResId();
+ method public String getProviderAuthority();
+ method public String getProviderPackage();
+ method public String getQuery();
+ }
+
+ public class FontsContractCompat {
+ method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo[]);
+ method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+ }
+
+ public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+ ctor public FontsContractCompat.Columns();
+ field public static final String FILE_ID = "file_id";
+ field public static final String ITALIC = "font_italic";
+ field public static final String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
+ field public static final String TTC_INDEX = "font_ttc_index";
+ field public static final String VARIATION_SETTINGS = "font_variation_settings";
+ field public static final String WEIGHT = "font_weight";
+ }
+
+ public static class FontsContractCompat.FontFamilyResult {
+ method public androidx.core.provider.FontsContractCompat.FontInfo[]! getFonts();
+ method public int getStatusCode();
+ field public static final int STATUS_OK = 0; // 0x0
+ field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+ field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+ }
+
+ public static class FontsContractCompat.FontInfo {
+ method public int getResultCode();
+ method @IntRange(from=0) public int getTtcIndex();
+ method public android.net.Uri getUri();
+ method @IntRange(from=1, to=1000) public int getWeight();
+ method public boolean isItalic();
+ }
+
+ public static class FontsContractCompat.FontRequestCallback {
+ ctor public FontsContractCompat.FontRequestCallback();
+ method public void onTypefaceRequestFailed(int);
+ method public void onTypefaceRetrieved(android.graphics.Typeface!);
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+ }
+
+}
+
+package androidx.core.telephony.mbms {
+
+ public final class MbmsHelper {
+ method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class BidiFormatter {
+ method public static androidx.core.text.BidiFormatter! getInstance();
+ method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+ method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+ method public boolean getStereoReset();
+ method public boolean isRtl(String!);
+ method public boolean isRtl(CharSequence!);
+ method public boolean isRtlContext();
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public String! unicodeWrap(String!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, boolean);
+ method public String! unicodeWrap(String!);
+ method public CharSequence! unicodeWrap(CharSequence!);
+ }
+
+ public static final class BidiFormatter.Builder {
+ ctor public BidiFormatter.Builder();
+ ctor public BidiFormatter.Builder(boolean);
+ ctor public BidiFormatter.Builder(java.util.Locale!);
+ method public androidx.core.text.BidiFormatter! build();
+ method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+ method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+ }
+
+ public final class HtmlCompat {
+ method public static android.text.Spanned fromHtml(String, int);
+ method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+ method public static String toHtml(android.text.Spanned, int);
+ field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+ field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+ field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+ field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+ field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+ }
+
+ public final class ICUCompat {
+ method public static String? maximizeAndGetScript(java.util.Locale!);
+ }
+
+ public class PrecomputedTextCompat implements android.text.Spannable {
+ method public char charAt(int);
+ method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+ method @IntRange(from=0) public int getParagraphCount();
+ method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+ method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+ method public int getSpanEnd(Object!);
+ method public int getSpanFlags(Object!);
+ method public int getSpanStart(Object!);
+ method public <T> T[]! getSpans(int, int, Class<T>!);
+ method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+ method public int length();
+ method public int nextSpanTransition(int, int, Class!);
+ method public void removeSpan(Object!);
+ method public void setSpan(Object!, int, int, int);
+ method public CharSequence! subSequence(int, int);
+ }
+
+ public static final class PrecomputedTextCompat.Params {
+ ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+ method @RequiresApi(23) public int getBreakStrategy();
+ method @RequiresApi(23) public int getHyphenationFrequency();
+ method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+ method public android.text.TextPaint getTextPaint();
+ }
+
+ public static class PrecomputedTextCompat.Params.Builder {
+ ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+ method public androidx.core.text.PrecomputedTextCompat.Params build();
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+ method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+ }
+
+ public interface TextDirectionHeuristicCompat {
+ method public boolean isRtl(char[]!, int, int);
+ method public boolean isRtl(CharSequence!, int, int);
+ }
+
+ public final class TextDirectionHeuristicsCompat {
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+ }
+
+ public final class TextUtilsCompat {
+ method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+ method public static String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.text.util {
+
+ public final class LinkifyCompat {
+ method public static boolean addLinks(android.text.Spannable, int);
+ method public static boolean addLinks(android.widget.TextView, int);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String[]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String[]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ }
+
+}
+
+package androidx.core.util {
+
+ public class AtomicFile {
+ ctor public AtomicFile(java.io.File);
+ method public void delete();
+ method public void failWrite(java.io.FileOutputStream?);
+ method public void finishWrite(java.io.FileOutputStream?);
+ method public java.io.File getBaseFile();
+ method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+ method public byte[] readFully() throws java.io.IOException;
+ method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+ }
+
+ public interface Consumer<T> {
+ method public void accept(T!);
+ }
+
+ public class ObjectsCompat {
+ method public static boolean equals(Object?, Object?);
+ method public static int hash(java.lang.Object...?);
+ method public static int hashCode(Object?);
+ }
+
+ public class Pair<F, S> {
+ ctor public Pair(F?, S?);
+ method public static <A, B> androidx.core.util.Pair<A,B> create(A?, B?);
+ field public final F? first;
+ field public final S? second;
+ }
+
+ public final class PatternsCompat {
+ field public static final java.util.regex.Pattern! DOMAIN_NAME;
+ field public static final java.util.regex.Pattern! EMAIL_ADDRESS;
+ field public static final java.util.regex.Pattern! IP_ADDRESS;
+ field public static final java.util.regex.Pattern! WEB_URL;
+ }
+
+ public final class Pools {
+ }
+
+ public static interface Pools.Pool<T> {
+ method public T? acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+ ctor public Pools.SimplePool(int);
+ method public T! acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+ ctor public Pools.SynchronizedPool(int);
+ }
+
+ public interface Supplier<T> {
+ method public T! get();
+ }
+
+}
+
+package androidx.core.view {
+
+ public class AccessibilityDelegateCompat {
+ ctor public AccessibilityDelegateCompat();
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+ method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+ method public void sendAccessibilityEvent(android.view.View!, int);
+ method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public abstract class ActionProvider {
+ ctor public ActionProvider(android.content.Context!);
+ method public android.content.Context! getContext();
+ method public boolean hasSubMenu();
+ method public boolean isVisible();
+ method public abstract android.view.View! onCreateActionView();
+ method public android.view.View! onCreateActionView(android.view.MenuItem!);
+ method public boolean onPerformDefaultAction();
+ method public void onPrepareSubMenu(android.view.SubMenu!);
+ method public boolean overridesItemVisibility();
+ method public void refreshVisibility();
+ method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+ }
+
+ public static interface ActionProvider.VisibilityListener {
+ method public void onActionProviderVisibilityChanged(boolean);
+ }
+
+ public final class DisplayCutoutCompat {
+ ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect>!);
+ method public java.util.List<android.graphics.Rect>! getBoundingRects();
+ method public int getSafeInsetBottom();
+ method public int getSafeInsetLeft();
+ method public int getSafeInsetRight();
+ method public int getSafeInsetTop();
+ }
+
+ public final class DragAndDropPermissionsCompat {
+ method public void release();
+ }
+
+ public class DragStartHelper {
+ ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+ method public void attach();
+ method public void detach();
+ method public void getTouchPosition(android.graphics.Point!);
+ method public boolean onLongClick(android.view.View!);
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ }
+
+ public static interface DragStartHelper.OnDragStartListener {
+ method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+ }
+
+ public final class GestureDetectorCompat {
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+ method public boolean isLongpressEnabled();
+ method public boolean onTouchEvent(android.view.MotionEvent!);
+ method public void setIsLongpressEnabled(boolean);
+ method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+ }
+
+ public final class GravityCompat {
+ method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+ method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static int getAbsoluteGravity(int, int);
+ field public static final int END = 8388613; // 0x800005
+ field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+ field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+ field public static final int START = 8388611; // 0x800003
+ }
+
+ public final class InputDeviceCompat {
+ field public static final int SOURCE_ANY = -256; // 0xffffff00
+ field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+ field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+ field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+ field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+ field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+ field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+ field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+ field public static final int SOURCE_DPAD = 513; // 0x201
+ field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+ field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+ field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+ field public static final int SOURCE_KEYBOARD = 257; // 0x101
+ field public static final int SOURCE_MOUSE = 8194; // 0x2002
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+ field public static final int SOURCE_STYLUS = 16386; // 0x4002
+ field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+ field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+ field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+ field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+ field public static final int SOURCE_UNKNOWN = 0; // 0x0
+ }
+
+ public final class LayoutInflaterCompat {
+ method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+ method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+ method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+ }
+
+ @Deprecated public interface LayoutInflaterFactory {
+ method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+ }
+
+ public final class MarginLayoutParamsCompat {
+ method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+ method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+ method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+ }
+
+ public final class MenuCompat {
+ method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ }
+
+ public final class MenuItemCompat {
+ method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+ method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+ method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+ method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+ method public static int getAlphabeticModifiers(android.view.MenuItem!);
+ method public static CharSequence! getContentDescription(android.view.MenuItem!);
+ method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+ method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+ method public static int getNumericModifiers(android.view.MenuItem!);
+ method public static CharSequence! getTooltipText(android.view.MenuItem!);
+ method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+ method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+ method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+ method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+ method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+ method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+ method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+ method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+ method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+ field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+ field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+ field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+ field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+ field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+ }
+
+ @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+ method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+ method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+ }
+
+ public final class MotionEventCompat {
+ method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+ method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+ method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+ method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+ method @Deprecated public static int getSource(android.view.MotionEvent!);
+ method @Deprecated public static float getX(android.view.MotionEvent!, int);
+ method @Deprecated public static float getY(android.view.MotionEvent!, int);
+ method public static boolean isFromSource(android.view.MotionEvent!, int);
+ field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+ field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+ field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+ field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+ field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+ field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+ field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+ field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+ field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+ field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+ field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+ field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+ field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+ field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+ field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+ field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+ field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+ field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+ field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+ field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+ field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+ field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+ field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+ field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+ field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+ field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+ field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+ field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+ field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+ field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+ field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+ field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+ field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+ field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+ field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+ field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+ field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+ field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+ field @Deprecated public static final int AXIS_RX = 12; // 0xc
+ field @Deprecated public static final int AXIS_RY = 13; // 0xd
+ field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
+ field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+ field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+ field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+ field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+ field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+ field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+ field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+ field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+ field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+ field @Deprecated public static final int AXIS_X = 0; // 0x0
+ field @Deprecated public static final int AXIS_Y = 1; // 0x1
+ field @Deprecated public static final int AXIS_Z = 11; // 0xb
+ field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+ }
+
+ public interface NestedScrollingChild {
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean isNestedScrollingEnabled();
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(int);
+ method public void stopNestedScroll();
+ }
+
+ public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, 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 void dispatchNestedScroll(int, 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 interface NestedScrollingParent {
+ method public int getNestedScrollAxes();
+ method public boolean onNestedFling(android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(android.view.View, float, float);
+ method public void onNestedPreScroll(android.view.View, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+ method public void onStopNestedScroll(android.view.View);
+ }
+
+ public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+ 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);
+ }
+
+ public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+ method public void onNestedScroll(android.view.View, int, int, int, int, int, 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 interface OnApplyWindowInsetsListener {
+ method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+ }
+
+ public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+ method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+ method public boolean onPreDraw();
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ method public void removeListener();
+ }
+
+ public final class PointerIconCompat {
+ method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+ method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+ method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+ field public static final int TYPE_ALIAS = 1010; // 0x3f2
+ field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+ field public static final int TYPE_ARROW = 1000; // 0x3e8
+ field public static final int TYPE_CELL = 1006; // 0x3ee
+ field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+ field public static final int TYPE_COPY = 1011; // 0x3f3
+ field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+ field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+ field public static final int TYPE_GRAB = 1020; // 0x3fc
+ field public static final int TYPE_GRABBING = 1021; // 0x3fd
+ field public static final int TYPE_HAND = 1002; // 0x3ea
+ field public static final int TYPE_HELP = 1003; // 0x3eb
+ field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+ field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+ field public static final int TYPE_NULL = 0; // 0x0
+ field public static final int TYPE_TEXT = 1008; // 0x3f0
+ field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+ field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+ field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+ field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+ field public static final int TYPE_WAIT = 1004; // 0x3ec
+ field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+ field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+ }
+
+ public final class ScaleGestureDetectorCompat {
+ method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+ method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+ method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+ method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+ }
+
+ public interface ScrollingView {
+ method public int computeHorizontalScrollExtent();
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ }
+
+ public interface TintableBackgroundView {
+ method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @Deprecated public final class VelocityTrackerCompat {
+ method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+ method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+ }
+
+ public class ViewCompat {
+ ctor protected ViewCompat();
+ method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+ method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View>, int);
+ method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+ method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+ method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+ method public static void cancelDragAndDrop(android.view.View);
+ method @Deprecated public static int combineMeasuredStates(int, int);
+ method public static androidx.core.view.WindowInsetsCompat! dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat!);
+ method public static void dispatchFinishTemporaryDetach(android.view.View);
+ method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+ method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+ method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+ method public static void dispatchStartTemporaryDetach(android.view.View);
+ method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+ method public static int generateViewId();
+ method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+ method public static int getAccessibilityLiveRegion(android.view.View);
+ method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+ method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+ method @Deprecated public static float getAlpha(android.view.View!);
+ method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+ method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+ method public static android.graphics.Rect? getClipBounds(android.view.View);
+ method public static android.view.Display? getDisplay(android.view.View);
+ method public static float getElevation(android.view.View);
+ method public static boolean getFitsSystemWindows(android.view.View);
+ method public static int getImportantForAccessibility(android.view.View);
+ method public static int getImportantForAutofill(android.view.View);
+ method public static int getLabelFor(android.view.View);
+ method @Deprecated public static int getLayerType(android.view.View!);
+ method public static int getLayoutDirection(android.view.View);
+ method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+ method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+ method @Deprecated public static int getMeasuredState(android.view.View!);
+ method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+ method public static int getMinimumHeight(android.view.View);
+ method public static int getMinimumWidth(android.view.View);
+ method public static int getNextClusterForwardId(android.view.View);
+ method @Deprecated public static int getOverScrollMode(android.view.View!);
+ method @Px public static int getPaddingEnd(android.view.View);
+ method @Px public static int getPaddingStart(android.view.View);
+ method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+ method @Deprecated public static float getPivotX(android.view.View!);
+ method @Deprecated public static float getPivotY(android.view.View!);
+ method @Deprecated public static float getRotation(android.view.View!);
+ method @Deprecated public static float getRotationX(android.view.View!);
+ method @Deprecated public static float getRotationY(android.view.View!);
+ method @Deprecated public static float getScaleX(android.view.View!);
+ method @Deprecated public static float getScaleY(android.view.View!);
+ method public static int getScrollIndicators(android.view.View);
+ method public static String? getTransitionName(android.view.View);
+ method @Deprecated public static float getTranslationX(android.view.View!);
+ method @Deprecated public static float getTranslationY(android.view.View!);
+ method public static float getTranslationZ(android.view.View);
+ method public static int getWindowSystemUiVisibility(android.view.View);
+ method @Deprecated public static float getX(android.view.View!);
+ method @Deprecated public static float getY(android.view.View!);
+ method public static float getZ(android.view.View);
+ method public static boolean hasAccessibilityDelegate(android.view.View);
+ method public static boolean hasExplicitFocusable(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View, int);
+ method public static boolean hasOnClickListeners(android.view.View);
+ method public static boolean hasOverlappingRendering(android.view.View);
+ method public static boolean hasTransientState(android.view.View);
+ method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+ method public static boolean isAttachedToWindow(android.view.View);
+ method public static boolean isFocusedByDefault(android.view.View);
+ method public static boolean isImportantForAccessibility(android.view.View);
+ method public static boolean isImportantForAutofill(android.view.View);
+ method public static boolean isInLayout(android.view.View);
+ method public static boolean isKeyboardNavigationCluster(android.view.View);
+ method public static boolean isLaidOut(android.view.View);
+ method public static boolean isLayoutDirectionResolved(android.view.View);
+ method public static boolean isNestedScrollingEnabled(android.view.View);
+ method @Deprecated public static boolean isOpaque(android.view.View!);
+ method public static boolean isPaddingRelative(android.view.View);
+ method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+ method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+ method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, int);
+ method public static void offsetLeftAndRight(android.view.View, int);
+ method public static void offsetTopAndBottom(android.view.View, int);
+ method public static androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat!);
+ method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+ method public static void postInvalidateOnAnimation(android.view.View);
+ method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+ method public static void postOnAnimation(android.view.View, Runnable!);
+ method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+ method public static void removeAccessibilityAction(android.view.View, int);
+ method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+ method public static void requestApplyInsets(android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+ method @Deprecated public static int resolveSizeAndState(int, int, int);
+ method public static boolean restoreDefaultFocus(android.view.View);
+ method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+ method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+ method public static void setAccessibilityLiveRegion(android.view.View, int);
+ method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+ method @Deprecated public static void setActivated(android.view.View!, boolean);
+ method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+ method public static void setAutofillHints(android.view.View, java.lang.String...?);
+ method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+ method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+ method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+ method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+ method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+ method public static void setElevation(android.view.View, float);
+ method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+ method public static void setFocusedByDefault(android.view.View, boolean);
+ method public static void setHasTransientState(android.view.View, boolean);
+ method public static void setImportantForAccessibility(android.view.View, int);
+ method public static void setImportantForAutofill(android.view.View, int);
+ method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+ method public static void setLabelFor(android.view.View, @IdRes int);
+ method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+ method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+ method public static void setLayoutDirection(android.view.View, int);
+ method public static void setNestedScrollingEnabled(android.view.View, boolean);
+ method public static void setNextClusterForwardId(android.view.View, int);
+ method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener!);
+ method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+ method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+ method @Deprecated public static void setPivotX(android.view.View!, float);
+ method @Deprecated public static void setPivotY(android.view.View!, float);
+ method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+ method @Deprecated public static void setRotation(android.view.View!, float);
+ method @Deprecated public static void setRotationX(android.view.View!, float);
+ method @Deprecated public static void setRotationY(android.view.View!, float);
+ method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+ method @Deprecated public static void setScaleX(android.view.View!, float);
+ method @Deprecated public static void setScaleY(android.view.View!, float);
+ method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+ method public static void setScrollIndicators(android.view.View, int);
+ method public static void setScrollIndicators(android.view.View, int, int);
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ method public static void setTransitionName(android.view.View, String!);
+ method @Deprecated public static void setTranslationX(android.view.View!, float);
+ method @Deprecated public static void setTranslationY(android.view.View!, float);
+ method public static void setTranslationZ(android.view.View, float);
+ method @Deprecated public static void setX(android.view.View!, float);
+ method @Deprecated public static void setY(android.view.View!, float);
+ method public static void setZ(android.view.View, float);
+ method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+ method public static boolean startNestedScroll(android.view.View, int);
+ method public static boolean startNestedScroll(android.view.View, int, int);
+ method public static void stopNestedScroll(android.view.View);
+ method public static void stopNestedScroll(android.view.View, int);
+ method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+ field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+ field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+ field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+ field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+ field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+ field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+ field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+ field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+ field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+ field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+ field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+ field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+ field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+ field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+ field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+ field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+ field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+ field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+ field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+ field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+ field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+ field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+ field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+ field public static final int TYPE_NON_TOUCH = 1; // 0x1
+ field public static final int TYPE_TOUCH = 0; // 0x0
+ }
+
+ public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+ method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+ }
+
+ public final class ViewConfigurationCompat {
+ method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+ method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+ method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+ method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+ }
+
+ public final class ViewGroupCompat {
+ method public static int getLayoutMode(android.view.ViewGroup);
+ method public static int getNestedScrollAxes(android.view.ViewGroup);
+ method public static boolean isTransitionGroup(android.view.ViewGroup);
+ method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void setLayoutMode(android.view.ViewGroup, int);
+ method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+ method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+ field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+ field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+ }
+
+ public final class ViewParentCompat {
+ method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+ method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+ method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public final class ViewPropertyAnimatorCompat {
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+ method public void cancel();
+ method public long getDuration();
+ method public android.view.animation.Interpolator! getInterpolator();
+ method public long getStartDelay();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+ method public void start();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+ }
+
+ public interface ViewPropertyAnimatorListener {
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+ ctor public ViewPropertyAnimatorListenerAdapter();
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public interface ViewPropertyAnimatorUpdateListener {
+ method public void onAnimationUpdate(android.view.View!);
+ }
+
+ public final class WindowCompat {
+ method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+ field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+ field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ }
+
+ public class WindowInsetsCompat {
+ ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat!);
+ method public androidx.core.view.WindowInsetsCompat! consumeDisplayCutout();
+ method public androidx.core.view.WindowInsetsCompat! consumeStableInsets();
+ method public androidx.core.view.WindowInsetsCompat! consumeSystemWindowInsets();
+ method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+ method public int getStableInsetBottom();
+ method public int getStableInsetLeft();
+ method public int getStableInsetRight();
+ method public int getStableInsetTop();
+ method public int getSystemWindowInsetBottom();
+ method public int getSystemWindowInsetLeft();
+ method public int getSystemWindowInsetRight();
+ method public int getSystemWindowInsetTop();
+ method public boolean hasInsets();
+ method public boolean hasStableInsets();
+ method public boolean hasSystemWindowInsets();
+ method public boolean isConsumed();
+ method public boolean isRound();
+ method public androidx.core.view.WindowInsetsCompat! replaceSystemWindowInsets(int, int, int, int);
+ method public androidx.core.view.WindowInsetsCompat! replaceSystemWindowInsets(android.graphics.Rect!);
+ }
+
+}
+
+package androidx.core.view.accessibility {
+
+ public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+ method public void onClick(android.view.View!);
+ }
+
+ public final class AccessibilityEventCompat {
+ method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+ method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+ method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+ method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+ method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+ method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+ field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+ field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+ field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+ field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+ field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+ field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+ field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+ field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+ field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+ field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+ field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+ field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+ field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+ field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+ field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+ field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+ field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+ field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+ field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+ field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+ field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+ field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+ }
+
+ public final class AccessibilityManagerCompat {
+ method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ }
+
+ @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ method @Deprecated public void onAccessibilityStateChanged(boolean);
+ }
+
+ @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+ }
+
+ public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+ method public void onTouchExplorationStateChanged(boolean);
+ }
+
+ public class AccessibilityNodeInfoCompat {
+ ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+ method public void addAction(int);
+ method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public void addChild(android.view.View!);
+ method public void addChild(android.view.View!, int);
+ method public boolean canOpenPopup();
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat>! findAccessibilityNodeInfosByText(String!);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat>! findAccessibilityNodeInfosByViewId(String!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat>! getActionList();
+ method public int getActions();
+ method public void getBoundsInParent(android.graphics.Rect!);
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public CharSequence! getClassName();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+ method public CharSequence! getContentDescription();
+ method public int getDrawingOrder();
+ method public CharSequence! getError();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence? getHintText();
+ method @Deprecated public Object! getInfo();
+ method public int getInputType();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+ method public int getLiveRegion();
+ method public int getMaxTextLength();
+ method public int getMovementGranularities();
+ method public CharSequence! getPackageName();
+ method public CharSequence? getPaneTitle();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+ method public CharSequence? getRoleDescription();
+ method public CharSequence! getText();
+ method public int getTextSelectionEnd();
+ method public int getTextSelectionStart();
+ method public CharSequence? getTooltipText();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+ method public String! getViewIdResourceName();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+ method public int getWindowId();
+ method public boolean isAccessibilityFocused();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isClickable();
+ method public boolean isContentInvalid();
+ method public boolean isContextClickable();
+ method public boolean isDismissable();
+ method public boolean isEditable();
+ method public boolean isEnabled();
+ method public boolean isFocusable();
+ method public boolean isFocused();
+ method public boolean isHeading();
+ method public boolean isImportantForAccessibility();
+ method public boolean isLongClickable();
+ method public boolean isMultiLine();
+ method public boolean isPassword();
+ method public boolean isScreenReaderFocusable();
+ method public boolean isScrollable();
+ method public boolean isSelected();
+ method public boolean isShowingHintText();
+ method public boolean isVisibleToUser();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public boolean performAction(int);
+ method public boolean performAction(int, android.os.Bundle!);
+ method public void recycle();
+ method public boolean refresh();
+ method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public boolean removeChild(android.view.View!);
+ method public boolean removeChild(android.view.View!, int);
+ method public void setAccessibilityFocused(boolean);
+ method public void setBoundsInParent(android.graphics.Rect!);
+ method public void setBoundsInScreen(android.graphics.Rect!);
+ method public void setCanOpenPopup(boolean);
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setClassName(CharSequence!);
+ method @Deprecated public void setClickable(boolean);
+ method public void setCollectionInfo(Object!);
+ method public void setCollectionItemInfo(Object!);
+ method public void setContentDescription(CharSequence!);
+ method public void setContentInvalid(boolean);
+ method @Deprecated public void setContextClickable(boolean);
+ method public void setDismissable(boolean);
+ method public void setDrawingOrder(int);
+ method public void setEditable(boolean);
+ method public void setEnabled(boolean);
+ method public void setError(CharSequence!);
+ method @Deprecated public void setFocusable(boolean);
+ method public void setFocused(boolean);
+ method public void setHeading(boolean);
+ method public void setHintText(CharSequence?);
+ method public void setImportantForAccessibility(boolean);
+ method public void setInputType(int);
+ method public void setLabelFor(android.view.View!);
+ method public void setLabelFor(android.view.View!, int);
+ method public void setLabeledBy(android.view.View!);
+ method public void setLabeledBy(android.view.View!, int);
+ method public void setLiveRegion(int);
+ method @Deprecated public void setLongClickable(boolean);
+ method public void setMaxTextLength(int);
+ method public void setMovementGranularities(int);
+ method public void setMultiLine(boolean);
+ method public void setPackageName(CharSequence!);
+ method public void setPaneTitle(CharSequence?);
+ method public void setParent(android.view.View!);
+ method public void setParent(android.view.View!, int);
+ method public void setPassword(boolean);
+ method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+ method public void setRoleDescription(CharSequence?);
+ method public void setScreenReaderFocusable(boolean);
+ method @Deprecated public void setScrollable(boolean);
+ method public void setSelected(boolean);
+ method public void setShowingHintText(boolean);
+ method public void setSource(android.view.View!);
+ method public void setSource(android.view.View!, int);
+ method public void setText(CharSequence!);
+ method public void setTextSelection(int, int);
+ method public void setTooltipText(CharSequence?);
+ method public void setTraversalAfter(android.view.View!);
+ method public void setTraversalAfter(android.view.View!, int);
+ method public void setTraversalBefore(android.view.View!);
+ method public void setTraversalBefore(android.view.View!, int);
+ method public void setViewIdResourceName(String!);
+ method public void setVisibleToUser(boolean);
+ method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+ field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+ field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+ field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+ field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+ field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+ field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+ field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+ field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+ field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+ field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+ field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+ field public static final int ACTION_CLICK = 16; // 0x10
+ field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+ field public static final int ACTION_COPY = 16384; // 0x4000
+ field public static final int ACTION_CUT = 65536; // 0x10000
+ field public static final int ACTION_DISMISS = 1048576; // 0x100000
+ field public static final int ACTION_EXPAND = 262144; // 0x40000
+ field public static final int ACTION_FOCUS = 1; // 0x1
+ field public static final int ACTION_LONG_CLICK = 32; // 0x20
+ field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+ field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+ field public static final int ACTION_PASTE = 32768; // 0x8000
+ field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+ field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+ field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+ field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+ field public static final int ACTION_SELECT = 4; // 0x4
+ field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+ field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+ field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+ field public static final int FOCUS_INPUT = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+ field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+ field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+ field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+ }
+
+ public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+ ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+ method public int getId();
+ method public CharSequence! getLabel();
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+ method public int getColumnCount();
+ method public int getRowCount();
+ method public int getSelectionMode();
+ method public boolean isHierarchical();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+ field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+ field public static final int SELECTION_MODE_NONE = 0; // 0x0
+ field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+ method public int getColumnIndex();
+ method public int getColumnSpan();
+ method public int getRowIndex();
+ method public int getRowSpan();
+ method @Deprecated public boolean isHeading();
+ method public boolean isSelected();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+ }
+
+ public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+ method public float getCurrent();
+ method public float getMax();
+ method public float getMin();
+ method public int getType();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+ field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+ field public static final int RANGE_TYPE_INT = 0; // 0x0
+ field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+ }
+
+ public class AccessibilityNodeProviderCompat {
+ ctor public AccessibilityNodeProviderCompat();
+ ctor public AccessibilityNodeProviderCompat(Object!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat>? findAccessibilityNodeInfosByText(String!, int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+ method public Object! getProvider();
+ method public boolean performAction(int, int, android.os.Bundle!);
+ field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+ }
+
+ public class AccessibilityRecordCompat {
+ ctor @Deprecated public AccessibilityRecordCompat(Object!);
+ method @Deprecated public boolean equals(Object?);
+ method @Deprecated public int getAddedCount();
+ method @Deprecated public CharSequence! getBeforeText();
+ method @Deprecated public CharSequence! getClassName();
+ method @Deprecated public CharSequence! getContentDescription();
+ method @Deprecated public int getCurrentItemIndex();
+ method @Deprecated public int getFromIndex();
+ method @Deprecated public Object! getImpl();
+ method @Deprecated public int getItemCount();
+ method @Deprecated public int getMaxScrollX();
+ method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public int getMaxScrollY();
+ method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public android.os.Parcelable! getParcelableData();
+ method @Deprecated public int getRemovedCount();
+ method @Deprecated public int getScrollX();
+ method @Deprecated public int getScrollY();
+ method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+ method @Deprecated public java.util.List<java.lang.CharSequence>! getText();
+ method @Deprecated public int getToIndex();
+ method @Deprecated public int getWindowId();
+ method @Deprecated public int hashCode();
+ method @Deprecated public boolean isChecked();
+ method @Deprecated public boolean isEnabled();
+ method @Deprecated public boolean isFullScreen();
+ method @Deprecated public boolean isPassword();
+ method @Deprecated public boolean isScrollable();
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+ method @Deprecated public void recycle();
+ method @Deprecated public void setAddedCount(int);
+ method @Deprecated public void setBeforeText(CharSequence!);
+ method @Deprecated public void setChecked(boolean);
+ method @Deprecated public void setClassName(CharSequence!);
+ method @Deprecated public void setContentDescription(CharSequence!);
+ method @Deprecated public void setCurrentItemIndex(int);
+ method @Deprecated public void setEnabled(boolean);
+ method @Deprecated public void setFromIndex(int);
+ method @Deprecated public void setFullScreen(boolean);
+ method @Deprecated public void setItemCount(int);
+ method @Deprecated public void setMaxScrollX(int);
+ method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setMaxScrollY(int);
+ method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setParcelableData(android.os.Parcelable!);
+ method @Deprecated public void setPassword(boolean);
+ method @Deprecated public void setRemovedCount(int);
+ method @Deprecated public void setScrollX(int);
+ method @Deprecated public void setScrollY(int);
+ method @Deprecated public void setScrollable(boolean);
+ method @Deprecated public void setSource(android.view.View!);
+ method @Deprecated public void setSource(android.view.View!, int);
+ method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+ method @Deprecated public void setToIndex(int);
+ }
+
+ public interface AccessibilityViewCommand {
+ method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+ }
+
+ public abstract static class AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.CommandArguments();
+ }
+
+ public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+ method public boolean getExtendSelection();
+ method public int getGranularity();
+ }
+
+ public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveHtmlArguments();
+ method public String! getHTMLElement();
+ }
+
+ public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveWindowArguments();
+ method public int getX();
+ method public int getY();
+ }
+
+ public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+ method public int getColumn();
+ method public int getRow();
+ }
+
+ public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetProgressArguments();
+ method public float getProgress();
+ }
+
+ public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetSelectionArguments();
+ method public int getEnd();
+ method public int getStart();
+ }
+
+ public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetTextArguments();
+ method public CharSequence! getText();
+ }
+
+ public class AccessibilityWindowInfoCompat {
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public int getId();
+ method public int getLayer();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+ method public CharSequence! getTitle();
+ method public int getType();
+ method public boolean isAccessibilityFocused();
+ method public boolean isActive();
+ method public boolean isFocused();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+ method public void recycle();
+ field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+ field public static final int TYPE_APPLICATION = 1; // 0x1
+ field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+ field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+ field public static final int TYPE_SYSTEM = 3; // 0x3
+ }
+
+}
+
+package androidx.core.view.animation {
+
+ public final class PathInterpolatorCompat {
+ method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+ method public static android.view.animation.Interpolator! create(float, float);
+ method public static android.view.animation.Interpolator! create(float, float, float, float);
+ }
+
+}
+
+package androidx.core.view.inputmethod {
+
+ public final class EditorInfoCompat {
+ ctor @Deprecated public EditorInfoCompat();
+ method public static String[] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+ method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String[]?);
+ field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+ field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+ }
+
+ public final class InputConnectionCompat {
+ ctor @Deprecated public InputConnectionCompat();
+ method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+ field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+ }
+
+ public static interface InputConnectionCompat.OnCommitContentListener {
+ method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+ }
+
+ public final class InputContentInfoCompat {
+ ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+ method public android.net.Uri getContentUri();
+ method public android.content.ClipDescription getDescription();
+ method public android.net.Uri? getLinkUri();
+ method public void releasePermission();
+ method public void requestPermission();
+ method public Object? unwrap();
+ method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+ ctor public AutoScrollHelper(android.view.View);
+ method public abstract boolean canTargetScrollHorizontally(int);
+ method public abstract boolean canTargetScrollVertically(int);
+ method public boolean isEnabled();
+ method public boolean isExclusive();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public abstract void scrollTargetBy(int, int);
+ method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+ method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+ method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+ method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+ method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+ field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+ field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+ field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+ field public static final float NO_MAX = 3.4028235E38f;
+ field public static final float NO_MIN = 0.0f;
+ field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+ }
+
+ public final class CompoundButtonCompat {
+ method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+ method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+ method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+ method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+ method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+ }
+
+ public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+ ctor public ContentLoadingProgressBar(android.content.Context);
+ ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+ method public void hide();
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void show();
+ }
+
+ public final class EdgeEffectCompat {
+ ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+ method @Deprecated public boolean draw(android.graphics.Canvas!);
+ method @Deprecated public void finish();
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean onAbsorb(int);
+ method @Deprecated public boolean onPull(float);
+ method @Deprecated public boolean onPull(float, float);
+ method public static void onPull(android.widget.EdgeEffect, float, float);
+ method @Deprecated public boolean onRelease();
+ method @Deprecated public void setSize(int, int);
+ }
+
+ public class ImageViewCompat {
+ method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+ method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+ method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+ method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class ListPopupWindowCompat {
+ method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+ method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+ }
+
+ public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+ ctor public ListViewAutoScrollHelper(android.widget.ListView);
+ method public boolean canTargetScrollHorizontally(int);
+ method public boolean canTargetScrollVertically(int);
+ method public void scrollTargetBy(int, int);
+ }
+
+ public final class ListViewCompat {
+ method public static boolean canScrollList(android.widget.ListView, int);
+ method public static void scrollListBy(android.widget.ListView, int);
+ }
+
+ public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+ method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+ method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+ method public void dispatchNestedScroll(int, int, 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 void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, 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 boolean pageScroll(int);
+ method public void setFillViewport(boolean);
+ method public void setOnScrollChangeListener(androidx.core.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 interface NestedScrollView.OnScrollChangeListener {
+ method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+ }
+
+ public final class PopupMenuCompat {
+ method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+ }
+
+ public final class PopupWindowCompat {
+ method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+ method public static int getWindowLayoutType(android.widget.PopupWindow);
+ method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+ method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+ method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+ }
+
+ @Deprecated public final class ScrollerCompat {
+ method @Deprecated public void abortAnimation();
+ method @Deprecated public boolean computeScrollOffset();
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+ method @Deprecated public float getCurrVelocity();
+ method @Deprecated public int getCurrX();
+ method @Deprecated public int getCurrY();
+ method @Deprecated public int getFinalX();
+ method @Deprecated public int getFinalY();
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean isOverScrolled();
+ method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+ method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+ method @Deprecated public boolean springBack(int, int, int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int, int);
+ }
+
+ public final class TextViewCompat {
+ method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+ method public static int getAutoSizeMinTextSize(android.widget.TextView);
+ method public static int getAutoSizeStepGranularity(android.widget.TextView);
+ method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+ method public static int getAutoSizeTextType(android.widget.TextView);
+ method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+ method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+ method public static android.graphics.drawable.Drawable[] getCompoundDrawablesRelative(android.widget.TextView);
+ method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+ method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+ method public static int getMaxLines(android.widget.TextView);
+ method public static int getMinLines(android.widget.TextView);
+ method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+ method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+ method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+ method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+ method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+ method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+ method public static void setFirstBaselineToTopHeight(android.widget.TextView, @Px @IntRange(from=0) int);
+ method public static void setLastBaselineToBottomHeight(android.widget.TextView, @Px @IntRange(from=0) int);
+ method public static void setLineHeight(android.widget.TextView, @Px @IntRange(from=0) int);
+ method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+ method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+ method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+ field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+ field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+ }
+
+ public interface TintableCompoundButton {
+ method public android.content.res.ColorStateList? getSupportButtonTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface TintableCompoundDrawablesView {
+ method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+}
+
diff --git a/core/api/current.txt b/core/api/current.txt
index 715d405..0ece2e3 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -31,6 +31,7 @@
method public static android.net.Uri? getReferrer(android.app.Activity);
method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
method public static void postponeEnterTransition(android.app.Activity);
+ method public static void recreate(android.app.Activity);
method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
method public static void requestPermissions(android.app.Activity, String[], @IntRange(from=0) int);
method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
@@ -1136,6 +1137,14 @@
}
+package androidx.core.location {
+
+ public final class LocationManagerCompat {
+ method public static boolean isLocationEnabled(android.location.LocationManager);
+ }
+
+}
+
package androidx.core.math {
public class MathUtils {
@@ -2812,13 +2821,13 @@
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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int computeHorizontalScrollExtent();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int computeHorizontalScrollOffset();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int computeHorizontalScrollRange();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int computeVerticalScrollExtent();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int computeVerticalScrollOffset();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public int computeVerticalScrollRange();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
diff --git a/core/api/res-1.1.0-alpha05.txt b/core/api/res-1.1.0-alpha05.txt
new file mode 100644
index 0000000..e52dd8c
--- /dev/null
+++ b/core/api/res-1.1.0-alpha05.txt
@@ -0,0 +1,17 @@
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr ttcIndex
diff --git a/core/build.gradle b/core/build.gradle
index 5111400..a17073f 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -7,10 +7,10 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.1")
+ api(project(":annotation"))
implementation("androidx.collection:collection:1.0.0")
api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
- api('androidx.versionedparcelable:versionedparcelable:1.1.0-alpha01')
+ api(project(":versionedparcelable"))
api(GUAVA_LISTENABLE_FUTURE)
implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha02")
diff --git a/core/ktx/api/1.1.0-alpha05.txt b/core/ktx/api/1.1.0-alpha05.txt
new file mode 100644
index 0000000..63739d2
--- /dev/null
+++ b/core/ktx/api/1.1.0-alpha05.txt
@@ -0,0 +1,642 @@
+// Signature format: 3.0
+package androidx.core.animation {
+
+ public final class AnimatorKt {
+ ctor public AnimatorKt();
+ method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat = {});
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause = {});
+ method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentValuesKt {
+ ctor public ContentValuesKt();
+ method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ContextKt {
+ ctor public ContextKt();
+ method public static inline <reified T> T! getSystemService(android.content.Context);
+ method public static inline void withStyledAttributes(android.content.Context, android.util.AttributeSet? set = null, int[] attrs, @AttrRes int defStyleAttr = 0, @StyleRes int defStyleRes = 0, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ }
+
+ public final class SharedPreferencesKt {
+ ctor public SharedPreferencesKt();
+ method public static inline void edit(android.content.SharedPreferences, boolean commit = false, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class TypedArrayKt {
+ ctor public TypedArrayKt();
+ method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence[] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorKt {
+ ctor public CursorKt();
+ method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+ method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+ method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+ method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+ method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+ method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+ method public static inline String? getStringOrNull(android.database.Cursor, int index);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteDatabaseKt {
+ ctor public SQLiteDatabaseKt();
+ method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapKt {
+ ctor public BitmapKt();
+ method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+ method public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+ method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888, boolean hasAlpha = true, android.graphics.ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.SRGB));
+ method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+ method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, boolean filter = true);
+ method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+ }
+
+ public final class CanvasKt {
+ ctor public CanvasKt();
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withMatrix(android.graphics.Canvas, android.graphics.Matrix matrix = android.graphics.Matrix(), kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withRotation(android.graphics.Canvas, float degrees = 0.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withScale(android.graphics.Canvas, float x = 1.0f, float y = 1.0f, float pivotX = 0.0f, float pivotY = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSkew(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withTranslation(android.graphics.Canvas, float x = 0.0f, float y = 0.0f, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class ColorKt {
+ ctor public ColorKt();
+ method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+ method public static inline operator int component1(int);
+ method @RequiresApi(26) public static inline operator float component1(long);
+ method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+ method public static inline operator int component2(int);
+ method @RequiresApi(26) public static inline operator float component2(long);
+ method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+ method public static inline operator int component3(int);
+ method @RequiresApi(26) public static inline operator float component3(long);
+ method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+ method public static inline operator int component4(int);
+ method @RequiresApi(26) public static inline operator float component4(long);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(int, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(int, android.graphics.ColorSpace colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(long, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(long, android.graphics.ColorSpace colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color! convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color! convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+ method public static inline int getAlpha(int);
+ method @RequiresApi(26) public static inline float getAlpha(long);
+ method public static inline int getBlue(int);
+ method @RequiresApi(26) public static inline float getBlue(long);
+ method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(long);
+ method public static inline int getGreen(int);
+ method @RequiresApi(26) public static inline float getGreen(long);
+ method @RequiresApi(26) public static inline float getLuminance(int);
+ method @RequiresApi(26) public static inline float getLuminance(long);
+ method public static inline int getRed(int);
+ method @RequiresApi(26) public static inline float getRed(long);
+ method @RequiresApi(26) public static inline boolean isSrgb(long);
+ method @RequiresApi(26) public static inline boolean isWideGamut(long);
+ method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(int);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(long);
+ method @ColorInt @RequiresApi(26) public static inline int toColorInt(long);
+ method @ColorInt public static inline int toColorInt(String);
+ method @ColorLong @RequiresApi(26) public static inline long toColorLong(int);
+ }
+
+ public final class ImageDecoderKt {
+ ctor public ImageDecoderKt();
+ method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ }
+
+ public final class MatrixKt {
+ ctor public MatrixKt();
+ method public static android.graphics.Matrix rotationMatrix(float degrees, float px = 0.0f, float py = 0.0f);
+ method public static android.graphics.Matrix scaleMatrix(float sx = 1.0f, float sy = 1.0f);
+ method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+ method public static android.graphics.Matrix translationMatrix(float tx = 0.0f, float ty = 0.0f);
+ method public static inline float[] values(android.graphics.Matrix);
+ }
+
+ public final class PathKt {
+ ctor public PathKt();
+ method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, float error = 0.5f);
+ method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+ }
+
+ public final class PictureKt {
+ ctor public PictureKt();
+ method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class PointKt {
+ ctor public PointKt();
+ method public static inline operator int component1(android.graphics.Point);
+ method public static inline operator float component1(android.graphics.PointF);
+ method public static inline operator int component2(android.graphics.Point);
+ method public static inline operator float component2(android.graphics.PointF);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+ method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+ method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+ method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+ method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+ }
+
+ public final class PorterDuffKt {
+ ctor public PorterDuffKt();
+ method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+ method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+ }
+
+ public final class RectKt {
+ ctor public RectKt();
+ method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator int component1(android.graphics.Rect);
+ method public static inline operator float component1(android.graphics.RectF);
+ method public static inline operator int component2(android.graphics.Rect);
+ method public static inline operator float component2(android.graphics.RectF);
+ method public static inline operator int component3(android.graphics.Rect);
+ method public static inline operator float component3(android.graphics.RectF);
+ method public static inline operator int component4(android.graphics.Rect);
+ method public static inline operator float component4(android.graphics.RectF);
+ method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+ method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+ method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+ method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+ }
+
+ public final class RegionKt {
+ ctor public RegionKt();
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+ method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+ method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region not(android.graphics.Region);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+ }
+
+ public final class ShaderKt {
+ ctor public ShaderKt();
+ method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class BitmapDrawableKt {
+ ctor public BitmapDrawableKt();
+ method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+ }
+
+ public final class ColorDrawableKt {
+ ctor public ColorDrawableKt();
+ method public static inline android.graphics.drawable.ColorDrawable toDrawable(int);
+ method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+ }
+
+ public final class DrawableKt {
+ ctor public DrawableKt();
+ method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, @Px int width = intrinsicWidth, @Px int height = intrinsicHeight, android.graphics.Bitmap.Config? config = null);
+ method public static void updateBounds(android.graphics.drawable.Drawable, @Px int left = android.graphics.Rect.left, @Px int top = android.graphics.Rect.top, @Px int right = android.graphics.Rect.right, @Px int bottom = android.graphics.Rect.bottom);
+ }
+
+ public final class IconKt {
+ ctor public IconKt();
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+ }
+
+}
+
+package androidx.core.location {
+
+ public final class LocationKt {
+ ctor public LocationKt();
+ method public static inline operator double component1(android.location.Location);
+ method public static inline operator double component2(android.location.Location);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class UriKt {
+ ctor public UriKt();
+ method public static java.io.File toFile(android.net.Uri);
+ method public static inline android.net.Uri toUri(String);
+ method public static inline android.net.Uri toUri(java.io.File);
+ }
+
+}
+
+package androidx.core.os {
+
+ public final class BundleKt {
+ ctor public BundleKt();
+ method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class HandlerKt {
+ ctor public HandlerKt();
+ method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, Object? token = null, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ }
+
+ public final class PersistableBundleKt {
+ ctor public PersistableBundleKt();
+ method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class TraceKt {
+ ctor public TraceKt();
+ method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class CharSequenceKt {
+ ctor public CharSequenceKt();
+ method public static inline boolean isDigitsOnly(CharSequence);
+ method public static inline int trimmedLength(CharSequence);
+ }
+
+ public final class HtmlKt {
+ ctor public HtmlKt();
+ method public static inline android.text.Spanned parseAsHtml(String, int flags = 0, android.text.Html.ImageGetter? imageGetter = null, android.text.Html.TagHandler? tagHandler = null);
+ method public static inline String toHtml(android.text.Spanned, int option = 0);
+ }
+
+ public final class LocaleKt {
+ ctor public LocaleKt();
+ method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+ }
+
+ public final class SpannableStringBuilderKt {
+ ctor public SpannableStringBuilderKt();
+ method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object[] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ }
+
+ public final class SpannableStringKt {
+ ctor public SpannableStringKt();
+ method public static inline void clearSpans(android.text.Spannable);
+ method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+ method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+ method public static inline android.text.Spannable toSpannable(CharSequence);
+ }
+
+ public final class SpannedStringKt {
+ ctor public SpannedStringKt();
+ method public static inline <reified T> T[]! getSpans(android.text.Spanned, int start = 0, int end = length);
+ method public static inline android.text.Spanned toSpanned(CharSequence);
+ }
+
+ public final class StringKt {
+ ctor public StringKt();
+ method public static inline String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.transition {
+
+ public final class TransitionKt {
+ ctor public TransitionKt();
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause = {});
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.util {
+
+ public final class AtomicFileKt {
+ ctor public AtomicFileKt();
+ method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+ method @RequiresApi(17) public static String readText(android.util.AtomicFile, java.nio.charset.Charset charset = Charsets.UTF_8);
+ method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+ method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+ method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, java.nio.charset.Charset charset = Charsets.UTF_8);
+ }
+
+ public final class HalfKt {
+ ctor public HalfKt();
+ method @RequiresApi(26) public static inline android.util.Half toHalf(short);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+ }
+
+ public final class LongSparseArrayKt {
+ ctor public LongSparseArrayKt();
+ method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T! value);
+ method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T! defaultValue);
+ method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T! value);
+ method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T! value);
+ method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ ctor public LruCacheKt();
+ method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf = { _, _ -> 1 }, kotlin.jvm.functions.Function1<? super K,? extends V> create = { (V)null }, kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved = { _, _, _, _ -> });
+ }
+
+ public final class PairKt {
+ ctor public PairKt();
+ method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+ method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+ }
+
+ public final class RangeKt {
+ ctor public RangeKt();
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+ }
+
+ public final class SizeKt {
+ ctor public SizeKt();
+ method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+ method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+ }
+
+ public final class SparseArrayKt {
+ ctor public SparseArrayKt();
+ method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T! value);
+ method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T! defaultValue);
+ method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(android.util.SparseArray<T>);
+ method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+ method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> boolean remove(android.util.SparseArray<T>, int key, T! value);
+ method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T! value);
+ method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+ }
+
+ public final class SparseBooleanArrayKt {
+ ctor public SparseBooleanArrayKt();
+ method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+ method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+ method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+ method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+ method public static inline int getSize(android.util.SparseBooleanArray);
+ method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+ method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+ method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+ method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+ method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+ }
+
+ public final class SparseIntArrayKt {
+ ctor public SparseIntArrayKt();
+ method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+ method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+ method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+ method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+ method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+ method public static inline int getSize(android.util.SparseIntArray);
+ method public static inline boolean isEmpty(android.util.SparseIntArray);
+ method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+ method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static boolean remove(android.util.SparseIntArray, int key, int value);
+ method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+ method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+ }
+
+ public final class SparseLongArrayKt {
+ ctor public SparseLongArrayKt();
+ method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+ method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+ method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+ method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+ method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+ method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+ }
+
+}
+
+package androidx.core.view {
+
+ public final class MenuKt {
+ ctor public MenuKt();
+ method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+ method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+ method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+ method public static inline int getSize(android.view.Menu);
+ method public static inline boolean isEmpty(android.view.Menu);
+ method public static inline boolean isNotEmpty(android.view.Menu);
+ method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+ method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+ }
+
+ public final class ViewGroupKt {
+ ctor public ViewGroupKt();
+ method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+ method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+ method public static operator android.view.View get(android.view.ViewGroup, int index);
+ method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+ method public static inline int getSize(android.view.ViewGroup);
+ method public static inline boolean isEmpty(android.view.ViewGroup);
+ method public static inline boolean isNotEmpty(android.view.ViewGroup);
+ method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+ method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+ method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, @Px int left = android.view.ViewGroup.MarginLayoutParams.leftMargin, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int right = android.view.ViewGroup.MarginLayoutParams.rightMargin, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+ method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, @Px int start = marginStart, @Px int top = android.view.ViewGroup.MarginLayoutParams.topMargin, @Px int end = marginEnd, @Px int bottom = android.view.ViewGroup.MarginLayoutParams.bottomMargin);
+ }
+
+ public final class ViewKt {
+ ctor public ViewKt();
+ method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static android.graphics.Bitmap drawToBitmap(android.view.View, android.graphics.Bitmap.Config config = android.graphics.Bitmap.Config.ARGB_8888);
+ method public static inline int getMarginBottom(android.view.View);
+ method public static inline int getMarginEnd(android.view.View);
+ method public static inline int getMarginLeft(android.view.View);
+ method public static inline int getMarginRight(android.view.View);
+ method public static inline int getMarginStart(android.view.View);
+ method public static inline int getMarginTop(android.view.View);
+ method public static inline boolean isGone(android.view.View);
+ method public static inline boolean isInvisible(android.view.View);
+ method public static inline boolean isVisible(android.view.View);
+ method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline void setGone(android.view.View, boolean value);
+ method public static inline void setInvisible(android.view.View, boolean value);
+ method public static inline void setPadding(android.view.View, @Px int size);
+ method public static inline void setVisible(android.view.View, boolean value);
+ method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+ method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParamsTyped(android.view.View, kotlin.jvm.functions.Function1<? super T,kotlin.Unit>! block);
+ method public static inline void updatePadding(android.view.View, @Px int left = paddingLeft, @Px int top = paddingTop, @Px int right = paddingRight, @Px int bottom = paddingBottom);
+ method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, @Px int start = paddingStart, @Px int top = paddingTop, @Px int end = paddingEnd, @Px int bottom = paddingBottom);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public final class TextViewKt {
+ ctor public TextViewKt();
+ method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged = { _, _, _, _ -> }, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged = { _, _, _, _ -> }, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged = {});
+ method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/core/ktx/api/res-1.1.0-alpha05.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to core/ktx/api/res-1.1.0-alpha05.txt
diff --git a/core/src/androidTest/AndroidManifest.xml b/core/src/androidTest/AndroidManifest.xml
index 02eb330..073a161 100644
--- a/core/src/androidTest/AndroidManifest.xml
+++ b/core/src/androidTest/AndroidManifest.xml
@@ -49,6 +49,7 @@
android:icon="@drawable/test_drawable_blue"/>
<activity android:name="androidx.core.app.TestComponentActivity"/>
+ <activity android:name="androidx.core.app.TestActivityWithLifecycle"/>
<activity android:name="androidx.core.view.DragStartHelperTestActivity"/>
diff --git a/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java b/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java
new file mode 100644
index 0000000..d803f53
--- /dev/null
+++ b/core/src/androidTest/java/androidx/core/app/ActivityCompatRecreateTestCase.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.core.app;
+
+import static androidx.testutils.LifecycleOwnerUtils.waitUntilState;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class ActivityCompatRecreateTestCase {
+ @Rule
+ public final ActivityTestRule<TestActivityWithLifecycle> mActivityTestRule;
+
+ public ActivityCompatRecreateTestCase() {
+ mActivityTestRule = new ActivityTestRule<>(TestActivityWithLifecycle.class);
+ }
+
+ @Test
+ public void testRecreate() throws Throwable {
+ final TestActivityWithLifecycle firstActivity = mActivityTestRule.getActivity();
+
+ // Wait and assert that the Activity is resumed
+ waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+
+ // Now recreate() the activity
+ mActivityTestRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ActivityCompat.recreate(firstActivity);
+ }
+ });
+ // Wait until the original activity is destroyed
+ waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.DESTROYED);
+
+ // Assert that the recreated Activity is resumed
+ final TestActivityWithLifecycle newActivity = mActivityTestRule.getActivity();
+ assertNotSame(firstActivity, newActivity);
+ assertEquals(Lifecycle.State.RESUMED, newActivity.getLifecycle().getCurrentState());
+ }
+
+ @Test
+ public void testRecreateWhenStopped() throws Throwable {
+ final TestActivityWithLifecycle firstActivity = mActivityTestRule.getActivity();
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+
+ // Assert that the activity is resumed currently
+ waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+
+ // Start a new Activity, so that the first Activity goes into the background
+ final Intent intent = new Intent(firstActivity, TestActivityWithLifecycle.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ final TestActivityWithLifecycle fgActivity =
+ (TestActivityWithLifecycle) instrumentation.startActivitySync(intent);
+
+ // Now wait until the new activity is resumed, and the original activity is stopped
+ waitUntilState(fgActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+ waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.CREATED);
+
+ // Now recreate() the stopped activity
+ mActivityTestRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ActivityCompat.recreate(firstActivity);
+ }
+ });
+
+ // Wait and assert that the original activity in the background is destroyed
+ // (since it is being recreated)
+ waitUntilState(firstActivity, mActivityTestRule, Lifecycle.State.DESTROYED);
+
+ // Now finish the foreground activity and wait until it is destroyed,
+ // allowing the recreated activity to come to the foreground
+ fgActivity.finish();
+ waitUntilState(fgActivity, mActivityTestRule, Lifecycle.State.DESTROYED);
+
+ // Assert that the activity was recreated and is resumed
+ final TestActivityWithLifecycle recreatedActivity = mActivityTestRule.getActivity();
+ assertNotSame(firstActivity, recreatedActivity);
+ // Assert that the recreated Activity is resumed
+ waitUntilState(recreatedActivity, mActivityTestRule, Lifecycle.State.RESUMED);
+ }
+}
diff --git a/core/src/androidTest/java/androidx/core/app/TestActivityWithLifecycle.java b/core/src/androidTest/java/androidx/core/app/TestActivityWithLifecycle.java
new file mode 100644
index 0000000..ccce935
--- /dev/null
+++ b/core/src/androidTest/java/androidx/core/app/TestActivityWithLifecycle.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.core.app;
+
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import androidx.activity.ComponentActivity;
+import androidx.core.test.R;
+
+public class TestActivityWithLifecycle extends ComponentActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ setContentView(R.layout.activity_compat_activity);
+ }
+}
diff --git a/core/src/androidTest/java/androidx/core/text/IcuCompatTest.java b/core/src/androidTest/java/androidx/core/text/IcuCompatTest.java
index 2b9efd6..b1a7500 100644
--- a/core/src/androidTest/java/androidx/core/text/IcuCompatTest.java
+++ b/core/src/androidTest/java/androidx/core/text/IcuCompatTest.java
@@ -18,9 +18,8 @@
import static org.junit.Assert.assertEquals;
-import android.os.Build;
-
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -35,11 +34,13 @@
@Test
public void testMaximizeAndGetScript() {
assertEquals("Latn", ICUCompat.maximizeAndGetScript(new Locale("en", "US")));
-
- // Script tags were added to java.util.Locale only on API 21.
- if (Build.VERSION.SDK_INT >= 21) {
- assertEquals(
- "Visp", ICUCompat.maximizeAndGetScript(Locale.forLanguageTag("en-Visp-US")));
- }
}
+
+ @Test
+ @SdkSuppress(minSdkVersion = 21)
+ public void testMaximizeAndGetScriptWithScriptTag() {
+ // Script tags were added to java.util.Locale only on API 21.
+ assertEquals("Visp", ICUCompat.maximizeAndGetScript(Locale.forLanguageTag("en-Visp-US")));
+ }
+
}
diff --git a/core/src/androidTest/java/androidx/core/view/DragStartHelperTest.java b/core/src/androidTest/java/androidx/core/view/DragStartHelperTest.java
index 8d0ce23..5cb6491 100644
--- a/core/src/androidTest/java/androidx/core/view/DragStartHelperTest.java
+++ b/core/src/androidTest/java/androidx/core/view/DragStartHelperTest.java
@@ -37,15 +37,20 @@
import androidx.annotation.NonNull;
import androidx.core.test.R;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.InOrder;
+@Ignore("Temporarily disabled due to b/110483469")
@RunWith(AndroidJUnit4.class)
public class DragStartHelperTest {
@@ -161,9 +166,8 @@
mDragSource = mActivityRule.getActivity().findViewById(R.id.drag_source);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void mouseClick() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -176,9 +180,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void mousePressWithSecondaryButton() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -193,9 +196,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void mouseDrag() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -212,9 +214,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void mouseDragWithNonprimaryButton() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -232,9 +233,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void mouseDragUsingTouchListener() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -258,9 +258,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void mouseDragWhenListenerReturnsFalse() throws Throwable {
final DragStartListener listener = createListener(false);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -282,9 +281,8 @@
inOrder.verifyNoMoreInteractions();
}
- // Temporarily disabled due to b/110483469
- // @LargeTest
- // @Test
+ @LargeTest
+ @Test
public void mouseLongPress() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -299,9 +297,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void touchDrag() throws Throwable {
final DragStartListener listener = createListener(false);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -316,9 +313,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @SmallTest
- // @Test
+ @SmallTest
+ @Test
public void touchTap() throws Throwable {
final DragStartListener listener = createListener(false);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -331,9 +327,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @LargeTest
- // @Test
+ @LargeTest
+ @Test
public void touchLongPress() throws Throwable {
final DragStartListener listener = createListener(true);
final DragStartHelper helper = createDragStartHelper(listener);
@@ -348,9 +343,8 @@
verifyNoMoreInteractions(listener);
}
- // Temporarily disabled due to b/110483469
- // @LargeTest
- // @Test
+ @LargeTest
+ @Test
public void touchLongPressUsingLongClickListener() throws Throwable {
final DragStartListener listener = createListener(true);
diff --git a/core/src/main/java/android/support/v4/os/ResultReceiver.java b/core/src/main/java/android/support/v4/os/ResultReceiver.java
index ae233ca..6342046 100644
--- a/core/src/main/java/android/support/v4/os/ResultReceiver.java
+++ b/core/src/main/java/android/support/v4/os/ResultReceiver.java
@@ -16,7 +16,7 @@
package android.support.v4.os;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.Bundle;
@@ -41,7 +41,7 @@
* break if your process goes away for any reason, etc.</p>
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("BanParcelableUsage")
public class ResultReceiver implements Parcelable {
final boolean mLocal;
diff --git a/core/src/main/java/androidx/core/app/ActivityCompat.java b/core/src/main/java/androidx/core/app/ActivityCompat.java
index 74b043b..523f70d 100644
--- a/core/src/main/java/androidx/core/app/ActivityCompat.java
+++ b/core/src/main/java/androidx/core/app/ActivityCompat.java
@@ -135,7 +135,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public interface RequestPermissionsRequestCodeValidator {
void validateRequestPermissionsRequestCode(int requestCode);
}
@@ -164,7 +164,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static PermissionCompatDelegate getPermissionCompatDelegate() {
return sDelegate;
}
@@ -565,6 +565,25 @@
return DragAndDropPermissionsCompat.request(activity, dragEvent);
}
+ /**
+ * Cause the given Activity to be recreated with a new instance. This version of the method
+ * allows a consistent behavior across API levels, emulating what happens on Android Pie (and
+ * newer) when running on older platforms.
+ *
+ * @param activity The activity to recreate
+ */
+ public static void recreate(@NonNull Activity activity) {
+ // On Android P and later we can safely rely on the platform recreate()
+ if (Build.VERSION.SDK_INT >= 28) {
+ activity.recreate();
+ } else {
+ if (!ActivityRecreator.recreate(activity)) {
+ // If ActivityRecreator did not start a recreation, we'll just invoke the platform
+ activity.recreate();
+ }
+ }
+ }
+
@RequiresApi(21)
private static class SharedElementCallback21Impl extends android.app.SharedElementCallback {
private final SharedElementCallback mCallback;
diff --git a/core/src/main/java/androidx/core/app/ActivityRecreator.java b/core/src/main/java/androidx/core/app/ActivityRecreator.java
new file mode 100644
index 0000000..5462a61
--- /dev/null
+++ b/core/src/main/java/androidx/core/app/ActivityRecreator.java
@@ -0,0 +1,376 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.core.app;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.Activity;
+import android.app.Application;
+import android.app.Application.ActivityLifecycleCallbacks;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
+/**
+ * The goal here is to get common (and correct) behavior around Activity recreation for all API
+ * versions up until P, where the behavior was specified to be useful and implemented to match the
+ * specification. On API 26 and 27, recreate() doesn't actually recreate the Activity if it's
+ * not in the foreground; it will be recreated when the user next interacts with it. This has a few
+ * undesirable consequences:
+ *
+ * <p>1. It's impossible to recreate multiple activities at once, which means that activities in the
+ * background will observe the new configuration before they're recreated. If we keep them on the
+ * old configuration, we have two conflicting configurations active in the app, which leads to
+ * logging skew.
+ *
+ * <p>2. Recreation occurs in the critical path of user interaction - re-inflating a bunch of views
+ * isn't free, and we'd rather do it when we're in the background than when the user is staring at
+ * the screen waiting to see us.
+ *
+ * <p>On API < 26, recreate() was implemented with a single call to a private method on
+ * ActivityThread. That method still exists in 26 and 27, so we can use reflection to call it and
+ * get the exact same behavior as < 26. However, that behavior has problems itself. When
+ * an Activity in the background is recreated, it goes through: destroy -> create -> start ->
+ * resume -> pause and doesn't stop. This is a violation of the contract for onStart/onStop,
+ * but that might be palatable if it didn't also have the effect of preventing new configurations
+ * from being applied - since the Activity doesn't go through onStop, our tracking of whether
+ * our app is visible thinks we're always visible, and thus can't do another recreation later.
+ *
+ * <p>The fix for this is to add the missing onStop() call, by using reflection to call into
+ * ActivityThread.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+@SuppressWarnings("PrivateApi")
+final class ActivityRecreator {
+ private ActivityRecreator() {}
+
+ // android.app.ActivityThread
+ protected static final Class<?> activityThreadClass;
+ // Activity.mMainThread
+ protected static final Field mainThreadField;
+ // Activity.mToken. This object is an identifier that is the same between multiple instances of
+ //the same underlying Activity.
+ protected static final Field tokenField;
+ // On API 25, a third param was added to performStopActivity
+ protected static final Method performStopActivity3ParamsMethod;
+ // Before API 25, performStopActivity had two params
+ protected static final Method performStopActivity2ParamsMethod;
+ // ActivityThread.requestRelaunchActivity
+ protected static final Method requestRelaunchActivityMethod;
+
+ private static final Handler mainHandler = new Handler(Looper.getMainLooper());
+
+ static {
+ activityThreadClass = getActivityThreadClass();
+ mainThreadField = getMainThreadField();
+ tokenField = getTokenField();
+ performStopActivity3ParamsMethod = getPerformStopActivity3Params(activityThreadClass);
+ performStopActivity2ParamsMethod = getPerformStopActivity2Params(activityThreadClass);
+ requestRelaunchActivityMethod = getRequestRelaunchActivityMethod(activityThreadClass);
+ }
+
+ /**
+ * Equivalent to {@link Activity#recreate}, but working around a number of platform bugs.
+ *
+ * @return true if a recreate() task was successfully scheduled.
+ */
+ static boolean recreate(@NonNull final Activity activity) {
+ // On Android O and later we can rely on the platform recreate()
+ if (Build.VERSION.SDK_INT >= 28) {
+ activity.recreate();
+ return true;
+ }
+
+ // API 26 needs this workaround but it's not possible because our reflective lookup failed.
+ if (needsRelaunchCall() && requestRelaunchActivityMethod == null) {
+ return false;
+ }
+ // All versions of android so far need this workaround, but it's not possible because our
+ // reflective lookup failed.
+ if (performStopActivity2ParamsMethod == null && performStopActivity3ParamsMethod == null) {
+ return false;
+ }
+ try {
+ final Object token = tokenField.get(activity);
+ if (token == null) {
+ return false;
+ }
+ Object activityThread = mainThreadField.get(activity);
+ if (activityThread == null) {
+ return false;
+ }
+
+ final Application application = activity.getApplication();
+ final LifecycleCheckCallbacks callbacks = new LifecycleCheckCallbacks(activity);
+ application.registerActivityLifecycleCallbacks(callbacks);
+
+ /*
+ * Runnables scheduled before/after recreate() will run before and after the Runnables
+ * scheduled by recreate(). This allows us to bound the time where mActivity lifecycle
+ * events that could be caused by recreate() run - that way we can detect onPause()
+ * from the new Activity instance, and schedule onStop to run immediately after it.
+ */
+ mainHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ callbacks.currentlyRecreatingToken = token;
+ }
+ });
+
+ try {
+ if (needsRelaunchCall()) {
+ requestRelaunchActivityMethod.invoke(activityThread,
+ token, null, null, 0, false, null, null, false, false);
+ } else {
+ activity.recreate();
+ }
+ return true;
+ } finally {
+ mainHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ // Since we're calling hidden API, it's entirely possible for it to
+ // simply do nothing;
+ // if that's the case, make sure to unregister so we don't leak memory
+ // waiting for an event that will never happen.
+ application.unregisterActivityLifecycleCallbacks(callbacks);
+ }
+ });
+ }
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return false;
+ }
+ }
+
+ private static final class LifecycleCheckCallbacks implements ActivityLifecycleCallbacks {
+ Object currentlyRecreatingToken;
+
+ private Activity mActivity;
+ private boolean mStarted = false;
+ private boolean mDestroyed = false;
+ private boolean mStopQueued = false;
+
+ LifecycleCheckCallbacks(@NonNull Activity aboutToRecreate) {
+ mActivity = aboutToRecreate;
+ }
+
+ @Override
+ public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
+ }
+
+ @Override
+ public void onActivityStarted(Activity activity) {
+ // If we see a start call on the original mActivity instance, then the mActivity
+ // starting event executed between our call to recreate() and the actual
+ // recreation of the mActivity. In that case, a stop() call should not be scheduled.
+ if (mActivity == activity) {
+ mStarted = true;
+ }
+ }
+
+ @Override
+ public void onActivityResumed(Activity activity) {
+ }
+
+ @Override
+ public void onActivityPaused(Activity activity) {
+ if (mDestroyed // Original mActivity must be gone
+ && !mStopQueued // Don't schedule stop twice for one recreate() call
+ && !mStarted
+ // Don't schedule stop if the original instance starting raced with recreate()
+ && queueOnStopIfNecessary(currentlyRecreatingToken, activity)) {
+ mStopQueued = true;
+ // Don't retain this object longer than necessary
+ currentlyRecreatingToken = null;
+ }
+ }
+
+ @Override
+ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+ }
+
+ @Override
+ public void onActivityStopped(Activity activity) {
+ // Not possible to get a start/stop pair in the same UI thread loop
+ }
+
+ @Override
+ public void onActivityDestroyed(Activity activity) {
+ if (mActivity == activity) {
+ // Once the original mActivity instance is mDestroyed, we don't need to compare to
+ // it any
+ // longer, and we don't want to retain it any longer than necessary.
+ mActivity = null;
+ mDestroyed = true;
+ }
+ }
+ }
+
+ /**
+ * Returns true if a stop call was scheduled successfully
+ */
+ protected static boolean queueOnStopIfNecessary(
+ Object currentlyRecreatingToken, Activity activity) {
+ try {
+ final Object token = tokenField.get(activity);
+ if (token != currentlyRecreatingToken) {
+ return false;
+ }
+ final Object activityThread = mainThreadField.get(activity);
+ // These operations are posted at the front of the queue, so that operations
+ // scheduled from onCreate, onStart etc run after the onStop call - this should
+ // cause any redundant loads to be immediately cancelled.
+ mainHandler.postAtFrontOfQueue(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ if (performStopActivity3ParamsMethod != null) {
+ performStopActivity3ParamsMethod.invoke(activityThread,
+ token, false, "AppCompat recreation");
+ } else {
+ performStopActivity2ParamsMethod.invoke(activityThread,
+ token, false);
+ }
+ } catch (RuntimeException e) {
+ // If an mActivity throws from onStop, don't swallow it
+ if (e.getClass() == RuntimeException.class
+ && e.getMessage() != null
+ && e.getMessage().startsWith("Unable to stop")) {
+ throw e;
+ } else {
+ handleReflectiveException(e);
+ }
+ // Otherwise just swallow it - we're calling random private methods,
+ // there's no
+ // guarantee on how they'll behave.
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ }
+ }
+ });
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ }
+ return true;
+ }
+
+ private static Method getPerformStopActivity3Params(Class<?> activityThreadClass) {
+ if (activityThreadClass == null) {
+ return null;
+ }
+ try {
+ Method performStop = activityThreadClass.getDeclaredMethod("performStopActivity",
+ IBinder.class, boolean.class, String.class);
+ performStop.setAccessible(true);
+ return performStop;
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return null;
+ }
+ }
+
+ private static Method getPerformStopActivity2Params(Class<?> activityThreadClass) {
+ if (activityThreadClass == null) {
+ return null;
+ }
+ try {
+ Method performStop = activityThreadClass.getDeclaredMethod("performStopActivity",
+ IBinder.class, boolean.class);
+ performStop.setAccessible(true);
+ return performStop;
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return null;
+ }
+ }
+
+ private static boolean needsRelaunchCall() {
+ return Build.VERSION.SDK_INT == 26 || Build.VERSION.SDK_INT == 27;
+ }
+
+ private static Method getRequestRelaunchActivityMethod(Class<?> activityThreadClass) {
+ if (!needsRelaunchCall() || activityThreadClass == null) {
+ return null;
+ }
+ try {
+ Method relaunch = activityThreadClass.getDeclaredMethod(
+ "requestRelaunchActivity",
+ IBinder.class,
+ List.class,
+ List.class,
+ int.class,
+ boolean.class,
+ Configuration.class,
+ Configuration.class,
+ boolean.class,
+ boolean.class);
+ relaunch.setAccessible(true);
+ return relaunch;
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return null;
+ }
+ }
+
+ private static Field getMainThreadField() {
+ try {
+ Field mainThreadField = Activity.class.getDeclaredField("mMainThread");
+ mainThreadField.setAccessible(true);
+ return mainThreadField;
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return null;
+ }
+ }
+
+ private static Field getTokenField() {
+ try {
+ Field tokenField = Activity.class.getDeclaredField("mToken");
+ tokenField.setAccessible(true);
+ return tokenField;
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return null;
+ }
+ }
+
+ private static Class<?> getActivityThreadClass() {
+ try {
+ return Class.forName("android.app.ActivityThread");
+ } catch (Throwable t) {
+ handleReflectiveException(t);
+ return null;
+ }
+ }
+
+ protected static void handleReflectiveException(Throwable t) {
+ t.printStackTrace();
+ }
+}
diff --git a/core/src/main/java/androidx/core/app/ComponentActivity.java b/core/src/main/java/androidx/core/app/ComponentActivity.java
index c9d3d92..864c4d8 100644
--- a/core/src/main/java/androidx/core/app/ComponentActivity.java
+++ b/core/src/main/java/androidx/core/app/ComponentActivity.java
@@ -16,7 +16,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.view.KeyEvent;
@@ -35,7 +35,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ComponentActivity extends Activity
implements KeyEventDispatcher.Component {
/**
@@ -55,7 +55,7 @@
* @see #getExtraData
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void putExtraData(ExtraData extraData) {
mExtraDataMap.put(extraData.getClass(), extraData);
}
@@ -66,7 +66,7 @@
* @see #putExtraData
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public <T extends ExtraData> T getExtraData(Class<T> extraDataClass) {
return (T) mExtraDataMap.get(extraDataClass);
}
@@ -74,7 +74,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public boolean superDispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
@@ -101,7 +101,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class ExtraData {
}
}
diff --git a/core/src/main/java/androidx/core/app/CoreComponentFactory.java b/core/src/main/java/androidx/core/app/CoreComponentFactory.java
index d179bc0..a74d729 100644
--- a/core/src/main/java/androidx/core/app/CoreComponentFactory.java
+++ b/core/src/main/java/androidx/core/app/CoreComponentFactory.java
@@ -33,7 +33,7 @@
* @hide
*/
@RequiresApi(api = 28)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class CoreComponentFactory extends AppComponentFactory {
@Override
public Activity instantiateActivity(ClassLoader cl, String className, Intent intent)
@@ -81,7 +81,7 @@
* on certain API levels.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public interface CompatWrapped {
/**
* Called while this class is being instantiated by the OS.
diff --git a/core/src/main/java/androidx/core/app/FrameMetricsAggregator.java b/core/src/main/java/androidx/core/app/FrameMetricsAggregator.java
index 9aa5c31..e335980 100644
--- a/core/src/main/java/androidx/core/app/FrameMetricsAggregator.java
+++ b/core/src/main/java/androidx/core/app/FrameMetricsAggregator.java
@@ -17,7 +17,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.os.Build;
@@ -172,7 +172,7 @@
private FrameMetricsBaseImpl mInstance;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef(
flag = true,
diff --git a/core/src/main/java/androidx/core/app/NotificationBuilderWithBuilderAccessor.java b/core/src/main/java/androidx/core/app/NotificationBuilderWithBuilderAccessor.java
index f779eb2..61ad3fc 100644
--- a/core/src/main/java/androidx/core/app/NotificationBuilderWithBuilderAccessor.java
+++ b/core/src/main/java/androidx/core/app/NotificationBuilderWithBuilderAccessor.java
@@ -16,7 +16,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Notification;
@@ -29,7 +29,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface NotificationBuilderWithBuilderAccessor {
Notification.Builder getBuilder();
}
diff --git a/core/src/main/java/androidx/core/app/NotificationCompat.java b/core/src/main/java/androidx/core/app/NotificationCompat.java
index 036de01..ac680c8 100644
--- a/core/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/core/src/main/java/androidx/core/app/NotificationCompat.java
@@ -16,7 +16,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -457,7 +457,7 @@
public static final int COLOR_DEFAULT = Color.TRANSPARENT;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_SYSTEM, AudioManager.STREAM_RING,
AudioManager.STREAM_MUSIC, AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION,
AudioManager.STREAM_DTMF, AudioManager.STREAM_ACCESSIBILITY})
@@ -465,7 +465,7 @@
public @interface StreamType {}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(SOURCE)
@IntDef({VISIBILITY_PUBLIC, VISIBILITY_PRIVATE, VISIBILITY_SECRET})
public @interface NotificationVisibility {}
@@ -576,7 +576,7 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({BADGE_ICON_NONE, BADGE_ICON_SMALL, BADGE_ICON_LARGE})
public @interface BadgeIconType {}
/**
@@ -598,7 +598,7 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({GROUP_ALERT_ALL, GROUP_ALERT_SUMMARY, GROUP_ALERT_CHILDREN})
public @interface GroupAlertBehavior {}
@@ -667,11 +667,11 @@
// extender.
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Context mContext;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ArrayList<Action> mActions = new ArrayList<>();
// Invisible actions are stored in the CarExtender bundle without actually being owned by
@@ -1601,7 +1601,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews getContentView() {
return mContentView;
}
@@ -1609,7 +1609,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews getBigContentView() {
return mBigContentView;
}
@@ -1617,7 +1617,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews getHeadsUpContentView() {
return mHeadsUpContentView;
}
@@ -1627,7 +1627,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public long getWhenIfShowing() {
return mShowWhen ? mNotification.when : 0;
}
@@ -1637,7 +1637,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getPriority() {
return mPriority;
}
@@ -1647,7 +1647,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getColor() {
return mColor;
}
@@ -1664,7 +1664,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected Builder mBuilder;
CharSequence mBigContentTitle;
CharSequence mSummaryText;
@@ -1693,7 +1693,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
// TODO: implement for all styles
public void apply(NotificationBuilderWithBuilderAccessor builder) {
}
@@ -1701,7 +1701,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
return null;
}
@@ -1709,7 +1709,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
return null;
}
@@ -1717,7 +1717,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
return null;
}
@@ -1725,7 +1725,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
// TODO: implement for all styles
public void addCompatExtras(Bundle extras) {
}
@@ -1733,7 +1733,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
// TODO: implement for all styles
protected void restoreFromCompatExtras(Bundle extras) {
}
@@ -1741,7 +1741,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteViews applyStandardTemplate(boolean showSmallIcon,
int resId, boolean fitIn1U) {
Resources res = mBuilder.mContext.getResources();
@@ -1889,7 +1889,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Bitmap createColoredBitmap(int iconId, int color) {
return createColoredBitmap(iconId, color, 0);
}
@@ -1926,7 +1926,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void buildIntoRemoteViews(RemoteViews outerView,
RemoteViews innerView) {
// this needs to be done fore the other calls, since otherwise we might hide the wrong
@@ -2036,7 +2036,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 16) {
@@ -2115,7 +2115,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 16) {
@@ -2380,7 +2380,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
// This is called because we need to apply legacy logic before writing MessagingInfo
@@ -2559,7 +2559,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void restoreFromCompatExtras(Bundle extras) {
mMessages.clear();
@@ -2888,7 +2888,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 16) {
@@ -2943,7 +2943,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -2954,7 +2954,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -2971,7 +2971,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -2992,7 +2992,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -4655,13 +4655,13 @@
*/
public static final class CarExtender implements Extender {
/** @hide **/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS";
private static final String EXTRA_LARGE_ICON = "large_icon";
private static final String EXTRA_CONVERSATION = "car_conversation";
private static final String EXTRA_COLOR = "app_color";
/** @hide **/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
static final String EXTRA_INVISIBLE_ACTIONS = "invisible_actions";
private static final String KEY_AUTHOR = "author";
diff --git a/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java b/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
index 6ec420a..ca2a3b7 100644
--- a/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
+++ b/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
@@ -16,7 +16,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.app.NotificationCompat.DEFAULT_SOUND;
import static androidx.core.app.NotificationCompat.DEFAULT_VIBRATE;
import static androidx.core.app.NotificationCompat.FLAG_GROUP_SUMMARY;
@@ -41,7 +41,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class NotificationCompatBuilder implements NotificationBuilderWithBuilderAccessor {
private final Notification.Builder mBuilder;
private final NotificationCompat.Builder mBuilderCompat;
diff --git a/core/src/main/java/androidx/core/app/Person.java b/core/src/main/java/androidx/core/app/Person.java
index 2b210eb..44f5c9c 100644
--- a/core/src/main/java/androidx/core/app/Person.java
+++ b/core/src/main/java/androidx/core/app/Person.java
@@ -16,7 +16,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.os.PersistableBundle;
@@ -63,7 +63,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
@RequiresApi(22)
public static Person fromPersistableBundle(@NonNull PersistableBundle bundle) {
@@ -81,7 +81,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(28)
@NonNull
public static Person fromAndroidPerson(@NonNull android.app.Person person) {
@@ -144,7 +144,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
@RequiresApi(22)
public PersistableBundle toPersistableBundle() {
@@ -168,7 +168,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
@RequiresApi(28)
public android.app.Person toAndroidPerson() {
diff --git a/core/src/main/java/androidx/core/app/RemoteInput.java b/core/src/main/java/androidx/core/app/RemoteInput.java
index 8a98cac..e579efd 100644
--- a/core/src/main/java/androidx/core/app/RemoteInput.java
+++ b/core/src/main/java/androidx/core/app/RemoteInput.java
@@ -57,7 +57,7 @@
/** @hide */
@IntDef({SOURCE_FREE_FORM_INPUT, SOURCE_CHOICE})
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
public @interface Source {}
diff --git a/core/src/main/java/androidx/core/app/ServiceCompat.java b/core/src/main/java/androidx/core/app/ServiceCompat.java
index 65a4c0e..f7d8ac4 100644
--- a/core/src/main/java/androidx/core/app/ServiceCompat.java
+++ b/core/src/main/java/androidx/core/app/ServiceCompat.java
@@ -16,7 +16,7 @@
package androidx.core.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Notification;
import android.app.Service;
@@ -78,7 +78,7 @@
public static final int STOP_FOREGROUND_DETACH = 1<<1;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(flag = true,
value = {
STOP_FOREGROUND_REMOVE,
diff --git a/core/src/main/java/androidx/core/content/PermissionChecker.java b/core/src/main/java/androidx/core/content/PermissionChecker.java
index 62dae8c..20697c7 100644
--- a/core/src/main/java/androidx/core/content/PermissionChecker.java
+++ b/core/src/main/java/androidx/core/content/PermissionChecker.java
@@ -16,7 +16,7 @@
package androidx.core.content;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -67,7 +67,7 @@
public static final int PERMISSION_DENIED_APP_OP = PackageManager.PERMISSION_DENIED - 1;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({PERMISSION_GRANTED,
PERMISSION_DENIED,
PERMISSION_DENIED_APP_OP})
diff --git a/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java b/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
index 27f7bf44..9c903f0 100644
--- a/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
+++ b/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
@@ -15,7 +15,7 @@
*/
package androidx.core.content.pm;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.content.Context;
@@ -99,7 +99,7 @@
* @hide
*/
@RequiresApi(22)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
private PersistableBundle buildExtrasBundle() {
PersistableBundle bundle = new PersistableBundle();
if (mPersons != null && mPersons.length > 0) {
@@ -227,7 +227,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public IconCompat getIcon() {
return mIcon;
}
@@ -236,7 +236,7 @@
* @hide
*/
@RequiresApi(25)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
@Nullable
static Person[] getPersonsFromExtra(@NonNull PersistableBundle bundle) {
@@ -257,7 +257,7 @@
* @hide
*/
@RequiresApi(25)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
@Nullable
static boolean getLongLivedFromExtra(@NonNull PersistableBundle bundle) {
@@ -283,7 +283,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder(@NonNull ShortcutInfoCompat shortcutInfo) {
mInfo = new ShortcutInfoCompat();
mInfo.mContext = shortcutInfo.mContext;
@@ -308,7 +308,7 @@
* @hide
*/
@RequiresApi(25)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder(@NonNull Context context, @NonNull ShortcutInfo shortcutInfo) {
mInfo = new ShortcutInfoCompat();
mInfo.mContext = context;
diff --git a/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java b/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java
index b5381f9..4bda3a7 100644
--- a/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java
+++ b/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java
@@ -16,7 +16,7 @@
package androidx.core.content.pm;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.AnyThread;
import androidx.annotation.RestrictTo;
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ShortcutInfoCompatSaver {
@AnyThread
public ListenableFuture<Void> addShortcuts(List<ShortcutInfoCompat> shortcuts) {
diff --git a/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java b/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java
index 2afb43c..0f90a91 100644
--- a/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java
+++ b/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java
@@ -16,7 +16,7 @@
package androidx.core.content.res;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -43,7 +43,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class ColorStateListInflaterCompat {
private ColorStateListInflaterCompat() {
diff --git a/core/src/main/java/androidx/core/content/res/ComplexColorCompat.java b/core/src/main/java/androidx/core/content/res/ComplexColorCompat.java
index d21771c..0dcd6b7 100644
--- a/core/src/main/java/androidx/core/content/res/ComplexColorCompat.java
+++ b/core/src/main/java/androidx/core/content/res/ComplexColorCompat.java
@@ -18,7 +18,7 @@
import static android.graphics.Color.TRANSPARENT;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.res.ColorStateList;
@@ -50,7 +50,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class ComplexColorCompat {
private static final String LOG_TAG = "ComplexColorCompat";
diff --git a/core/src/main/java/androidx/core/content/res/FontResourcesParserCompat.java b/core/src/main/java/androidx/core/content/res/FontResourcesParserCompat.java
index 5a6554a..79c1625 100644
--- a/core/src/main/java/androidx/core/content/res/FontResourcesParserCompat.java
+++ b/core/src/main/java/androidx/core/content/res/FontResourcesParserCompat.java
@@ -16,7 +16,7 @@
package androidx.core.content.res;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -48,7 +48,7 @@
* Parser for xml type font resources.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class FontResourcesParserCompat {
private static final int NORMAL_WEIGHT = 400;
private static final int ITALIC = 1;
diff --git a/core/src/main/java/androidx/core/content/res/GradientColorInflaterCompat.java b/core/src/main/java/androidx/core/content/res/GradientColorInflaterCompat.java
index e38be52..eaa38ac 100644
--- a/core/src/main/java/androidx/core/content/res/GradientColorInflaterCompat.java
+++ b/core/src/main/java/androidx/core/content/res/GradientColorInflaterCompat.java
@@ -21,7 +21,7 @@
import static android.graphics.drawable.GradientDrawable.RADIAL_GRADIENT;
import static android.graphics.drawable.GradientDrawable.SWEEP_GRADIENT;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -51,7 +51,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
final class GradientColorInflaterCompat {
@IntDef({TILE_MODE_CLAMP, TILE_MODE_REPEAT, TILE_MODE_MIRROR})
diff --git a/core/src/main/java/androidx/core/content/res/ResourcesCompat.java b/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
index 0b0141f..63dbdb0 100644
--- a/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
+++ b/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
@@ -18,7 +18,7 @@
import static android.os.Build.VERSION.SDK_INT;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -262,7 +262,7 @@
* null.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final void callbackSuccessAsync(final Typeface typeface, @Nullable Handler handler) {
if (handler == null) {
handler = new Handler(Looper.getMainLooper());
@@ -280,7 +280,7 @@
* null.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final void callbackFailAsync(
@FontRequestFailReason final int reason, @Nullable Handler handler) {
if (handler == null) {
@@ -330,7 +330,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,
int style, @Nullable FontCallback fontCallback) throws NotFoundException {
if (context.isRestricted()) {
diff --git a/core/src/main/java/androidx/core/content/res/TypedArrayUtils.java b/core/src/main/java/androidx/core/content/res/TypedArrayUtils.java
index db9e88a..edacea2 100644
--- a/core/src/main/java/androidx/core/content/res/TypedArrayUtils.java
+++ b/core/src/main/java/androidx/core/content/res/TypedArrayUtils.java
@@ -15,7 +15,7 @@
*/
package androidx.core.content.res;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -45,7 +45,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TypedArrayUtils {
private static final String NAMESPACE = "http://schemas.android.com/apk/res/android";
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompat.java b/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
index 9257c71..a55a4134 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -71,7 +71,7 @@
* @hide
*/
@Nullable
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface findFromCache(@NonNull Resources resources, int id, int style) {
return sTypefaceCache.get(createResourceUid(resources, id, style));
}
@@ -95,7 +95,7 @@
* @hide
*/
@Nullable
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface createFromResourcesFamilyXml(
@NonNull Context context, @NonNull FamilyResourceEntry entry,
@NonNull Resources resources, int id, int style,
@@ -136,7 +136,7 @@
* @hide
*/
@Nullable
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface createFromResourcesFontFile(
@NonNull Context context, @NonNull Resources resources, int id, String path,
int style) {
@@ -154,7 +154,7 @@
* @hide
*/
@Nullable
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface createFromFontInfo(@NonNull Context context,
@Nullable CancellationSignal cancellationSignal, @NonNull FontInfo[] fonts, int style) {
return sTypefaceCompatImpl.createFromFontInfo(context, cancellationSignal, fonts, style);
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java
index 843f9e3..b544dcf 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentResolver;
import android.content.Context;
@@ -49,7 +49,7 @@
* Implementation of the Typeface compat methods for API 21 and above.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(21)
class TypefaceCompatApi21Impl extends TypefaceCompatBaseImpl {
private static final String TAG = "TypefaceCompatApi21Impl";
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java
index 9ca9845..59bc562 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -46,7 +46,7 @@
* Implementation of the Typeface compat methods for API 24 and above.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(24)
class TypefaceCompatApi24Impl extends TypefaceCompatBaseImpl {
private static final String TAG = "TypefaceCompatApi24Impl";
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java
index 569b901..84ca5ae 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentResolver;
import android.content.Context;
@@ -49,7 +49,7 @@
* Implementation of the Typeface compat methods for API 26 and above.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(26)
public class TypefaceCompatApi26Impl extends TypefaceCompatApi21Impl {
private static final String TAG = "TypefaceCompatApi26Impl";
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java
index 5703675..4bc2756 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Typeface;
@@ -31,7 +31,7 @@
* Implementation of the Typeface compat methods for API 28 and above.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(28)
public class TypefaceCompatApi28Impl extends TypefaceCompatApi26Impl {
private static final String CREATE_FROM_FAMILIES_WITH_DEFAULT_METHOD =
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompatBaseImpl.java b/core/src/main/java/androidx/core/graphics/TypefaceCompatBaseImpl.java
index 221aaa8..2a717ec 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompatBaseImpl.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompatBaseImpl.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -41,7 +41,7 @@
* Implementation of the Typeface compat methods for API 14 and above.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class TypefaceCompatBaseImpl {
private static final String TAG = "TypefaceCompatBaseImpl";
private static final int INVALID_KEY = 0;
diff --git a/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java b/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
index 128af4a..1e6ca0e 100644
--- a/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
+++ b/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
@@ -16,7 +16,7 @@
package androidx.core.graphics;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentResolver;
import android.content.Context;
@@ -45,7 +45,7 @@
* Utility methods for TypefaceCompat.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TypefaceCompatUtil {
private static final String TAG = "TypefaceCompatUtil";
diff --git a/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java b/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
index 3ebc39c..845ef0c 100644
--- a/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
+++ b/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
@@ -23,9 +23,8 @@
import static android.graphics.drawable.Icon.TYPE_URI;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
@@ -85,7 +84,6 @@
*/
@VersionedParcelize(allowSerialization = true, ignoreParcelables = true, isCustom = true,
jetifyAs = "android.support.v4.graphics.drawable.IconCompat")
-@SuppressLint("RestrictedApi")
public class IconCompat extends CustomVersionedParcelable {
private static final String TAG = "IconCompat";
@@ -124,7 +122,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(value = 1,
defaultValue = "androidx.core.graphics.drawable.IconCompat.TYPE_UNKNOWN")
public int mType = TYPE_UNKNOWN;
@@ -203,7 +201,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {
if (pkg == null) {
throw new IllegalArgumentException("Package must not be null.");
@@ -374,7 +372,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
public Bitmap getBitmap() {
if (mType == TYPE_UNKNOWN && Build.VERSION.SDK_INT >= 23) {
@@ -486,7 +484,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void checkResource(Context context) {
if (mType == TYPE_RESOURCE) {
String resPackage = (String) mObj1;
@@ -613,7 +611,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressWarnings("deprecation")
public void addToShortcutIntent(@NonNull Intent outIntent, @Nullable Drawable badge,
@NonNull Context c) {
@@ -889,7 +887,7 @@
* Creates an IconCompat from an Icon.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(23)
@Nullable
public static IconCompat createFromIcon(@NonNull Icon icon) {
diff --git a/core/src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java b/core/src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java
index 651ab87..4cc224f 100644
--- a/core/src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java
+++ b/core/src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java
@@ -16,7 +16,7 @@
package androidx.core.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface TintAwareDrawable {
void setTint(@ColorInt int tint);
void setTintList(ColorStateList tint);
diff --git a/core/src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java b/core/src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java
index ff6de25..270264b 100644
--- a/core/src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java
+++ b/core/src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java
@@ -16,7 +16,7 @@
package androidx.core.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.drawable.Drawable;
@@ -28,7 +28,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface WrappedDrawable {
Drawable getWrappedDrawable();
void setWrappedDrawable(Drawable drawable);
diff --git a/core/src/main/java/androidx/core/internal/package-info.java b/core/src/main/java/androidx/core/internal/package-info.java
index d7498be..743237e 100644
--- a/core/src/main/java/androidx/core/internal/package-info.java
+++ b/core/src/main/java/androidx/core/internal/package-info.java
@@ -1,9 +1,9 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
package androidx.core.internal;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
\ No newline at end of file
diff --git a/core/src/main/java/androidx/core/internal/view/SupportMenu.java b/core/src/main/java/androidx/core/internal/view/SupportMenu.java
index db10567..b3f70a0 100644
--- a/core/src/main/java/androidx/core/internal/view/SupportMenu.java
+++ b/core/src/main/java/androidx/core/internal/view/SupportMenu.java
@@ -16,7 +16,7 @@
package androidx.core.internal.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.KeyEvent;
@@ -31,7 +31,7 @@
* @see android.view.Menu
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface SupportMenu extends android.view.Menu {
/**
diff --git a/core/src/main/java/androidx/core/internal/view/SupportMenuItem.java b/core/src/main/java/androidx/core/internal/view/SupportMenuItem.java
index 784e16e..53a8d6b 100644
--- a/core/src/main/java/androidx/core/internal/view/SupportMenuItem.java
+++ b/core/src/main/java/androidx/core/internal/view/SupportMenuItem.java
@@ -16,7 +16,7 @@
package androidx.core.internal.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
@@ -36,7 +36,7 @@
* @see android.view.MenuItem
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface SupportMenuItem extends android.view.MenuItem {
/*
* These should be kept in sync with attrs.xml enum constants for showAsAction
diff --git a/core/src/main/java/androidx/core/internal/view/SupportSubMenu.java b/core/src/main/java/androidx/core/internal/view/SupportSubMenu.java
index 7ebb9d5..fb8cb46 100644
--- a/core/src/main/java/androidx/core/internal/view/SupportSubMenu.java
+++ b/core/src/main/java/androidx/core/internal/view/SupportSubMenu.java
@@ -16,7 +16,7 @@
package androidx.core.internal.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -29,6 +29,6 @@
* @see android.view.SubMenu
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface SupportSubMenu extends SupportMenu, android.view.SubMenu {
}
diff --git a/core/src/main/java/androidx/core/location/LocationManagerCompat.java b/core/src/main/java/androidx/core/location/LocationManagerCompat.java
new file mode 100644
index 0000000..71f2c24
--- /dev/null
+++ b/core/src/main/java/androidx/core/location/LocationManagerCompat.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.core.location;
+
+import android.location.LocationManager;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Helper for accessing features in {@link LocationManager}.
+ */
+public final class LocationManagerCompat {
+
+ /**
+ * Returns the current enabled/disabled state of location.
+ *
+ * @return true if location is enabled and false if location is disabled.
+ */
+ public static boolean isLocationEnabled(@NonNull LocationManager locationManager) {
+ if (VERSION.SDK_INT >= VERSION_CODES.P) {
+ return locationManager.isLocationEnabled();
+ } else {
+ // NOTE: for KitKat and above, it's preferable to use the proper API at the time to get
+ // the location mode, Secure.getInt(context, LOCATION_MODE, LOCATION_MODE_OFF). however,
+ // this requires a context we don't have directly (we could either ask the client to
+ // pass one in, or use reflection to get it from the location manager), and since KitKat
+ // and above remained backwards compatible, we can fallback to pre-kitkat behavior.
+
+ return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
+ || locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
+ }
+ }
+
+ private LocationManagerCompat() {}
+}
diff --git a/core/src/main/java/androidx/core/net/ConnectivityManagerCompat.java b/core/src/main/java/androidx/core/net/ConnectivityManagerCompat.java
index 333e9d3..ff286af 100644
--- a/core/src/main/java/androidx/core/net/ConnectivityManagerCompat.java
+++ b/core/src/main/java/androidx/core/net/ConnectivityManagerCompat.java
@@ -26,7 +26,7 @@
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIMAX;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Intent;
import android.net.ConnectivityManager;
@@ -47,7 +47,7 @@
*/
public final class ConnectivityManagerCompat {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
RESTRICT_BACKGROUND_STATUS_DISABLED,
diff --git a/core/src/main/java/androidx/core/provider/FontRequest.java b/core/src/main/java/androidx/core/provider/FontRequest.java
index c539a04..6fb880e 100644
--- a/core/src/main/java/androidx/core/provider/FontRequest.java
+++ b/core/src/main/java/androidx/core/provider/FontRequest.java
@@ -16,7 +16,7 @@
package androidx.core.provider;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.util.Base64;
@@ -138,7 +138,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public String getIdentifier() {
return mIdentifier;
}
diff --git a/core/src/main/java/androidx/core/provider/FontsContractCompat.java b/core/src/main/java/androidx/core/provider/FontsContractCompat.java
index b6e7b4a..7ac8df7 100644
--- a/core/src/main/java/androidx/core/provider/FontsContractCompat.java
+++ b/core/src/main/java/androidx/core/provider/FontsContractCompat.java
@@ -16,7 +16,7 @@
package androidx.core.provider;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
@@ -156,16 +156,16 @@
* returned to the ResultReceiver in getFont.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARCEL_FONT_RESULTS = "font_results";
// Error codes internal to the system, which can not come from a provider. To keep the number
// space open for new provider codes, these should all be negative numbers.
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
/* package */ static final int RESULT_CODE_PROVIDER_NOT_FOUND = -1;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
/* package */ static final int RESULT_CODE_WRONG_CERTIFICATES = -2;
// Note -3 is used by FontRequestCallback to indicate the font failed to load.
@@ -218,13 +218,13 @@
* Used for tests, should not be used otherwise.
* @hide
**/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void resetCache() {
sTypefaceCache.evictAll();
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface getFontSync(final Context context, final FontRequest request,
final @Nullable ResourcesCompat.FontCallback fontCallback,
final @Nullable Handler handler, boolean isBlockingFetch, int timeout,
@@ -340,7 +340,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public FontInfo(@NonNull Uri uri, @IntRange(from = 0) int ttcIndex,
@IntRange(from = 1, to = 1000) int weight,
boolean italic, int resultCode) {
@@ -414,7 +414,7 @@
public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({STATUS_OK, STATUS_WRONG_CERTIFICATES, STATUS_UNEXPECTED_DATA_PROVIDED})
@Retention(RetentionPolicy.SOURCE)
@interface FontResultStatus {}
@@ -423,7 +423,7 @@
private final FontInfo[] mFonts;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public FontFamilyResult(@FontResultStatus int statusCode, @Nullable FontInfo[] fonts) {
mStatusCode = statusCode;
mFonts = fonts;
@@ -443,7 +443,7 @@
*/
public static class FontRequestCallback {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int RESULT_OK = Columns.RESULT_CODE_OK;
/**
* Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
@@ -482,7 +482,7 @@
public static final int FAIL_REASON_MALFORMED_QUERY = Columns.RESULT_CODE_MALFORMED_QUERY;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({ FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
FAIL_REASON_FONT_NOT_FOUND, FAIL_REASON_FONT_UNAVAILABLE,
FAIL_REASON_MALFORMED_QUERY, FAIL_REASON_WRONG_CERTIFICATES,
@@ -673,7 +673,7 @@
* @return A map from {@link Uri} to {@link ByteBuffer}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public static Map<Uri, ByteBuffer> prepareFontData(Context context, FontInfo[] fonts,
CancellationSignal cancellationSignal) {
@@ -728,7 +728,7 @@
/** @hide */
@VisibleForTesting
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static @Nullable ProviderInfo getProvider(@NonNull PackageManager packageManager,
@NonNull FontRequest request, @Nullable Resources resources)
throws PackageManager.NameNotFoundException {
diff --git a/core/src/main/java/androidx/core/provider/SelfDestructiveThread.java b/core/src/main/java/androidx/core/provider/SelfDestructiveThread.java
index bf17e31..5575676 100644
--- a/core/src/main/java/androidx/core/provider/SelfDestructiveThread.java
+++ b/core/src/main/java/androidx/core/provider/SelfDestructiveThread.java
@@ -17,7 +17,7 @@
package androidx.core.provider;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Handler;
import android.os.HandlerThread;
@@ -39,7 +39,7 @@
* finished.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class SelfDestructiveThread {
private final Object mLock = new Object();
diff --git a/core/src/main/java/androidx/core/text/HtmlCompat.java b/core/src/main/java/androidx/core/text/HtmlCompat.java
index 265f90a..8d9b932 100644
--- a/core/src/main/java/androidx/core/text/HtmlCompat.java
+++ b/core/src/main/java/androidx/core/text/HtmlCompat.java
@@ -16,7 +16,7 @@
package androidx.core.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -122,7 +122,7 @@
FROM_HTML_MODE_COMPACT,
FROM_HTML_MODE_LEGACY
}, flag = true)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(SOURCE)
@interface FromHtmlFlags {
}
@@ -132,7 +132,7 @@
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE,
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
})
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(SOURCE)
@interface ToHtmlOptions {
}
diff --git a/core/src/main/java/androidx/core/text/ICUCompat.java b/core/src/main/java/androidx/core/text/ICUCompat.java
index 25143d6..b1260b2 100644
--- a/core/src/main/java/androidx/core/text/ICUCompat.java
+++ b/core/src/main/java/androidx/core/text/ICUCompat.java
@@ -16,6 +16,7 @@
package androidx.core.text;
+import android.icu.util.ULocale;
import android.os.Build;
import android.util.Log;
@@ -32,16 +33,7 @@
private static Method sAddLikelySubtagsMethod;
static {
- if (Build.VERSION.SDK_INT >= 21) {
- try {
- // This class should always exist on API-21 since it's CTS tested.
- final Class<?> clazz = Class.forName("libcore.icu.ICU");
- sAddLikelySubtagsMethod = clazz.getMethod("addLikelySubtags",
- new Class[]{ Locale.class });
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
- } else {
+ if (Build.VERSION.SDK_INT < 21) {
try {
final Class<?> clazz = Class.forName("libcore.icu.ICU");
if (clazz != null) {
@@ -57,6 +49,15 @@
// Nothing we can do here, we just log the exception
Log.w(TAG, e);
}
+ } else if (Build.VERSION.SDK_INT < 24) {
+ try {
+ // This class should always exist on API-21 since it's CTS tested.
+ final Class<?> clazz = Class.forName("libcore.icu.ICU");
+ sAddLikelySubtagsMethod = clazz.getMethod("addLikelySubtags",
+ new Class[]{ Locale.class });
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
}
}
@@ -85,7 +86,10 @@
*/
@Nullable
public static String maximizeAndGetScript(Locale locale) {
- if (Build.VERSION.SDK_INT >= 21) {
+ if (Build.VERSION.SDK_INT >= 24) {
+ ULocale uLocale = ULocale.addLikelySubtags(ULocale.forLocale(locale));
+ return uLocale.getScript();
+ } else if (Build.VERSION.SDK_INT >= 21) {
try {
final Object[] args = new Object[] { locale };
return ((Locale) sAddLikelySubtagsMethod.invoke(null, args)).getScript();
diff --git a/core/src/main/java/androidx/core/text/PrecomputedTextCompat.java b/core/src/main/java/androidx/core/text/PrecomputedTextCompat.java
index 34b2047..66d1a3e 100644
--- a/core/src/main/java/androidx/core/text/PrecomputedTextCompat.java
+++ b/core/src/main/java/androidx/core/text/PrecomputedTextCompat.java
@@ -16,7 +16,7 @@
package androidx.core.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Build;
import android.text.Layout;
@@ -260,7 +260,7 @@
* Similar to equals but don't compare text direction
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean equalsWithoutTextDirection(@NonNull Params other) {
if (mWrapped != null) {
@@ -495,7 +495,7 @@
* Returns the underlying original text if the text is PrecomputedText.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(28)
public @Nullable PrecomputedText getPrecomputedText() {
if (mText instanceof PrecomputedText) {
diff --git a/core/src/main/java/androidx/core/text/util/FindAddress.java b/core/src/main/java/androidx/core/text/util/FindAddress.java
index 2bd2e5f..baad256 100644
--- a/core/src/main/java/androidx/core/text/util/FindAddress.java
+++ b/core/src/main/java/androidx/core/text/util/FindAddress.java
@@ -16,7 +16,7 @@
package androidx.core.text.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class FindAddress {
private static class ZipRange {
int mLow;
diff --git a/core/src/main/java/androidx/core/text/util/LinkifyCompat.java b/core/src/main/java/androidx/core/text/util/LinkifyCompat.java
index 3e86b63..493c688 100644
--- a/core/src/main/java/androidx/core/text/util/LinkifyCompat.java
+++ b/core/src/main/java/androidx/core/text/util/LinkifyCompat.java
@@ -16,7 +16,7 @@
package androidx.core.text.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.Build;
@@ -80,7 +80,7 @@
};
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(flag = true, value = { Linkify.WEB_URLS, Linkify.EMAIL_ADDRESSES, Linkify.PHONE_NUMBERS,
Linkify.MAP_ADDRESSES, Linkify.ALL })
@Retention(RetentionPolicy.SOURCE)
diff --git a/core/src/main/java/androidx/core/util/DebugUtils.java b/core/src/main/java/androidx/core/util/DebugUtils.java
index 20486f2..7b0d9be 100644
--- a/core/src/main/java/androidx/core/util/DebugUtils.java
+++ b/core/src/main/java/androidx/core/util/DebugUtils.java
@@ -16,7 +16,7 @@
package androidx.core.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -25,7 +25,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class DebugUtils {
public static void buildShortClassTag(Object cls, StringBuilder out) {
diff --git a/core/src/main/java/androidx/core/util/LogWriter.java b/core/src/main/java/androidx/core/util/LogWriter.java
index 52eef6a..4359659 100644
--- a/core/src/main/java/androidx/core/util/LogWriter.java
+++ b/core/src/main/java/androidx/core/util/LogWriter.java
@@ -16,7 +16,7 @@
package androidx.core.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.util.Log;
@@ -29,7 +29,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class LogWriter extends Writer {
private final String mTag;
private StringBuilder mBuilder = new StringBuilder(128);
diff --git a/core/src/main/java/androidx/core/util/PatternsCompat.java b/core/src/main/java/androidx/core/util/PatternsCompat.java
index a0ea74a..41e0c394 100644
--- a/core/src/main/java/androidx/core/util/PatternsCompat.java
+++ b/core/src/main/java/androidx/core/util/PatternsCompat.java
@@ -16,7 +16,7 @@
package androidx.core.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -299,7 +299,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final Pattern AUTOLINK_WEB_URL = Pattern.compile(
"(" + WEB_URL_WITH_PROTOCOL + "|" + WEB_URL_WITHOUT_PROTOCOL + ")");
@@ -328,7 +328,7 @@
* and the special characters #&~!^`{}/=$*?| that are included in RFC5321.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final Pattern AUTOLINK_EMAIL_ADDRESS = Pattern.compile("(" + WORD_BOUNDARY +
"(?:" + EMAIL_ADDRESS_LOCAL_PART + "@" + EMAIL_ADDRESS_DOMAIN + ")" +
WORD_BOUNDARY + ")"
diff --git a/core/src/main/java/androidx/core/util/Preconditions.java b/core/src/main/java/androidx/core/util/Preconditions.java
index 2cae25a..aa32684 100644
--- a/core/src/main/java/androidx/core/util/Preconditions.java
+++ b/core/src/main/java/androidx/core/util/Preconditions.java
@@ -29,7 +29,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public final class Preconditions {
public static void checkArgument(boolean expression) {
if (!expression) {
diff --git a/core/src/main/java/androidx/core/util/TimeUtils.java b/core/src/main/java/androidx/core/util/TimeUtils.java
index 8950ea5c..206d372 100644
--- a/core/src/main/java/androidx/core/util/TimeUtils.java
+++ b/core/src/main/java/androidx/core/util/TimeUtils.java
@@ -16,7 +16,7 @@
package androidx.core.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -27,10 +27,10 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class TimeUtils {
/** @hide Field length that can hold 999 days of time */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int HUNDRED_DAY_FIELD_LEN = 19;
private static final int SECONDS_PER_MINUTE = 60;
@@ -149,7 +149,7 @@
}
/** @hide Just for debugging; not internationalized. */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void formatDuration(long duration, StringBuilder builder) {
synchronized (sFormatSync) {
int len = formatDurationLocked(duration, 0);
@@ -158,7 +158,7 @@
}
/** @hide Just for debugging; not internationalized. */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void formatDuration(long duration, PrintWriter pw, int fieldLen) {
synchronized (sFormatSync) {
int len = formatDurationLocked(duration, fieldLen);
@@ -167,13 +167,13 @@
}
/** @hide Just for debugging; not internationalized. */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void formatDuration(long duration, PrintWriter pw) {
formatDuration(duration, pw, 0);
}
/** @hide Just for debugging; not internationalized. */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void formatDuration(long time, long now, PrintWriter pw) {
if (time == 0) {
pw.print("--");
diff --git a/core/src/main/java/androidx/core/view/AccessibilityDelegateCompat.java b/core/src/main/java/androidx/core/view/AccessibilityDelegateCompat.java
index 1db8f22..640c588 100644
--- a/core/src/main/java/androidx/core/view/AccessibilityDelegateCompat.java
+++ b/core/src/main/java/androidx/core/view/AccessibilityDelegateCompat.java
@@ -16,7 +16,7 @@
package androidx.core.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Build;
import android.os.Bundle;
@@ -142,7 +142,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public AccessibilityDelegateCompat(AccessibilityDelegate originalDelegate) {
mOriginalDelegate = originalDelegate;
mBridge = new AccessibilityDelegateAdapter(this);
diff --git a/core/src/main/java/androidx/core/view/ActionProvider.java b/core/src/main/java/androidx/core/view/ActionProvider.java
index 0cd19f0..8282642 100644
--- a/core/src/main/java/androidx/core/view/ActionProvider.java
+++ b/core/src/main/java/androidx/core/view/ActionProvider.java
@@ -16,7 +16,7 @@
package androidx.core.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.Log;
@@ -274,7 +274,7 @@
*
* @hide Pending future API approval
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void subUiVisibilityChanged(boolean isVisible) {
if (mSubUiVisibilityListener != null) {
mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible);
@@ -284,7 +284,7 @@
/**
* @hide Internal use only
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSubUiVisibilityListener(SubUiVisibilityListener listener) {
mSubUiVisibilityListener = listener;
}
@@ -307,7 +307,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void reset() {
mVisibilityListener = null;
mSubUiVisibilityListener = null;
@@ -316,7 +316,7 @@
/**
* @hide Internal use only
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface SubUiVisibilityListener {
void onSubUiVisibilityChanged(boolean isVisible);
diff --git a/core/src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java b/core/src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java
index 3f2e787..a301729 100644
--- a/core/src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java
+++ b/core/src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java
@@ -16,7 +16,7 @@
package androidx.core.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.os.Build;
@@ -38,7 +38,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
public static DragAndDropPermissionsCompat request(Activity activity, DragEvent dragEvent) {
if (Build.VERSION.SDK_INT >= 24) {
diff --git a/core/src/main/java/androidx/core/view/KeyEventDispatcher.java b/core/src/main/java/androidx/core/view/KeyEventDispatcher.java
index 2dffda8..820d463 100644
--- a/core/src/main/java/androidx/core/view/KeyEventDispatcher.java
+++ b/core/src/main/java/androidx/core/view/KeyEventDispatcher.java
@@ -40,7 +40,7 @@
* This must be used for some core compatibility features to function fully.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class KeyEventDispatcher {
// reflection accessors
private static boolean sActionBarFieldsFetched = false;
diff --git a/core/src/main/java/androidx/core/view/PointerIconCompat.java b/core/src/main/java/androidx/core/view/PointerIconCompat.java
index 54e55d7..7d23936 100644
--- a/core/src/main/java/androidx/core/view/PointerIconCompat.java
+++ b/core/src/main/java/androidx/core/view/PointerIconCompat.java
@@ -18,7 +18,7 @@
import static android.os.Build.VERSION.SDK_INT;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -111,7 +111,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Object getPointerIcon() {
return mPointerIcon;
}
diff --git a/core/src/main/java/androidx/core/view/ViewCompat.java b/core/src/main/java/androidx/core/view/ViewCompat.java
index fdeaa5b..f5925bd 100644
--- a/core/src/main/java/androidx/core/view/ViewCompat.java
+++ b/core/src/main/java/androidx/core/view/ViewCompat.java
@@ -16,7 +16,7 @@
package androidx.core.view;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
@@ -86,20 +86,20 @@
private static final String TAG = "ViewCompat";
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN,
View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
@Retention(RetentionPolicy.SOURCE)
public @interface FocusDirection {}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN})
@Retention(RetentionPolicy.SOURCE)
public @interface FocusRealDirection {}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
@Retention(RetentionPolicy.SOURCE)
public @interface FocusRelativeDirection {}
@@ -352,7 +352,7 @@
*/
@IntDef(value = {SCROLL_AXIS_NONE, SCROLL_AXIS_HORIZONTAL, SCROLL_AXIS_VERTICAL}, flag = true)
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface ScrollAxis {}
/**
@@ -375,7 +375,7 @@
*/
@IntDef({TYPE_TOUCH, TYPE_NON_TOUCH})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface NestedScrollType {}
/**
@@ -390,7 +390,7 @@
public static final int TYPE_NON_TOUCH = 1;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true,
value = {
diff --git a/core/src/main/java/androidx/core/view/accessibility/AccessibilityClickableSpanCompat.java b/core/src/main/java/androidx/core/view/accessibility/AccessibilityClickableSpanCompat.java
index 9a79391..4d1ddd67 100644
--- a/core/src/main/java/androidx/core/view/accessibility/AccessibilityClickableSpanCompat.java
+++ b/core/src/main/java/androidx/core/view/accessibility/AccessibilityClickableSpanCompat.java
@@ -15,7 +15,7 @@
*/
package androidx.core.view.accessibility;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.text.style.ClickableSpan;
@@ -41,7 +41,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
/**
@@ -49,7 +49,7 @@
* @param nodeInfoCompat The nodeInfoCompat to be associated with this span.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public AccessibilityClickableSpanCompat(int originalClickableSpanId,
AccessibilityNodeInfoCompat nodeInfoCompat, int clickableSpanActionId) {
mOriginalClickableSpanId = originalClickableSpanId;
diff --git a/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java b/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
index ef4b19b..2f784ae 100644
--- a/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -16,7 +16,7 @@
package androidx.core.view.accessibility;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.os.Build;
@@ -510,7 +510,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected final AccessibilityViewCommand mCommand;
/**
@@ -531,7 +531,7 @@
* @param command The command performed when the service requests the action
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public AccessibilityActionCompat(int actionId, CharSequence label,
AccessibilityViewCommand command) {
this(null, actionId, label, command, null);
@@ -594,7 +594,7 @@
* @param arguments Optional action arguments.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean perform(View view, Bundle arguments) {
if (mCommand != null) {
CommandArguments viewCommandArgument = null;
@@ -618,7 +618,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public AccessibilityActionCompat createReplacementAction(CharSequence label,
AccessibilityViewCommand command) {
return new AccessibilityActionCompat(null, mId, label, command,
@@ -1040,7 +1040,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int mParentVirtualDescendantId = -1;
// Actions introduced in IceCreamSandwich
@@ -2472,7 +2472,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void addSpansToExtras(CharSequence text, View view) {
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 26) {
clearExtrasSpans();
@@ -2508,7 +2508,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static ClickableSpan[] getClickableSpans(CharSequence text) {
if (text instanceof Spanned) {
Spanned spanned = (Spanned) text;
diff --git a/core/src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java b/core/src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java
index 37037a0..00bf9ba 100644
--- a/core/src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java
+++ b/core/src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java
@@ -16,7 +16,7 @@
package androidx.core.view.accessibility;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.view.View;
@@ -51,7 +51,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setBundle(Bundle bundle) {
mBundle = bundle;
}
diff --git a/core/src/main/java/androidx/core/widget/AutoSizeableTextView.java b/core/src/main/java/androidx/core/widget/AutoSizeableTextView.java
index 93994c5..315f298 100644
--- a/core/src/main/java/androidx/core/widget/AutoSizeableTextView.java
+++ b/core/src/main/java/androidx/core/widget/AutoSizeableTextView.java
@@ -16,7 +16,7 @@
package androidx.core.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Build;
import android.util.TypedValue;
@@ -30,12 +30,12 @@
*
* @hide Internal use only
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface AutoSizeableTextView {
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
boolean PLATFORM_SUPPORTS_AUTOSIZE = Build.VERSION.SDK_INT >= 27;
/**
diff --git a/core/src/main/java/androidx/core/widget/ImageViewCompat.java b/core/src/main/java/androidx/core/widget/ImageViewCompat.java
index 3ec5b88..61fb20b 100644
--- a/core/src/main/java/androidx/core/widget/ImageViewCompat.java
+++ b/core/src/main/java/androidx/core/widget/ImageViewCompat.java
@@ -54,9 +54,7 @@
// Work around a bug in L that did not update the state of the image source
// after applying the tint
Drawable imageViewDrawable = view.getDrawable();
- boolean hasTint = (view.getImageTintList() != null)
- && (view.getImageTintMode() != null);
- if ((imageViewDrawable != null) && hasTint) {
+ if ((imageViewDrawable != null) && (view.getImageTintList() != null)) {
if (imageViewDrawable.isStateful()) {
imageViewDrawable.setState(view.getDrawableState());
}
@@ -94,9 +92,7 @@
// Work around a bug in L that did not update the state of the image source
// after applying the tint
Drawable imageViewDrawable = view.getDrawable();
- boolean hasTint = (view.getImageTintList() != null)
- && (view.getImageTintMode() != null);
- if ((imageViewDrawable != null) && hasTint) {
+ if ((imageViewDrawable != null) && (view.getImageTintList() != null)) {
if (imageViewDrawable.isStateful()) {
imageViewDrawable.setState(view.getDrawableState());
}
diff --git a/core/src/main/java/androidx/core/widget/NestedScrollView.java b/core/src/main/java/androidx/core/widget/NestedScrollView.java
index 944d86d..cc8ee0c 100644
--- a/core/src/main/java/androidx/core/widget/NestedScrollView.java
+++ b/core/src/main/java/androidx/core/widget/NestedScrollView.java
@@ -17,7 +17,7 @@
package androidx.core.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -1447,7 +1447,7 @@
* children.</p>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int computeVerticalScrollRange() {
final int count = getChildCount();
@@ -1471,35 +1471,35 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int computeVerticalScrollOffset() {
return Math.max(0, super.computeVerticalScrollOffset());
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int computeVerticalScrollExtent() {
return super.computeVerticalScrollExtent();
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int computeHorizontalScrollRange() {
return super.computeHorizontalScrollRange();
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int computeHorizontalScrollOffset() {
return super.computeHorizontalScrollOffset();
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public int computeHorizontalScrollExtent() {
return super.computeHorizontalScrollExtent();
diff --git a/core/src/main/java/androidx/core/widget/TextViewCompat.java b/core/src/main/java/androidx/core/widget/TextViewCompat.java
index fcc6164..9597110 100644
--- a/core/src/main/java/androidx/core/widget/TextViewCompat.java
+++ b/core/src/main/java/androidx/core/widget/TextViewCompat.java
@@ -24,7 +24,7 @@
import static android.view.View.TEXT_DIRECTION_LTR;
import static android.view.View.TEXT_DIRECTION_RTL;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.content.Context;
@@ -90,7 +90,7 @@
public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({AUTO_SIZE_TEXT_TYPE_NONE, AUTO_SIZE_TEXT_TYPE_UNIFORM})
@Retention(RetentionPolicy.SOURCE)
public @interface AutoSizeTextType {}
@@ -511,7 +511,7 @@
* @see #setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
public static ActionMode.Callback wrapCustomSelectionActionModeCallback(
@NonNull final TextView textView,
diff --git a/core/src/main/java/androidx/core/widget/TintableImageSourceView.java b/core/src/main/java/androidx/core/widget/TintableImageSourceView.java
index 63cfa92..1bf8732 100644
--- a/core/src/main/java/androidx/core/widget/TintableImageSourceView.java
+++ b/core/src/main/java/androidx/core/widget/TintableImageSourceView.java
@@ -16,7 +16,7 @@
package androidx.core.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
@@ -30,7 +30,7 @@
*
* @hide Internal use only
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface TintableImageSourceView {
/**
diff --git a/cursoradapter/api/1.1.0-alpha01.txt b/cursoradapter/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..f70e257
--- /dev/null
+++ b/cursoradapter/api/1.1.0-alpha01.txt
@@ -0,0 +1,62 @@
+// Signature format: 3.0
+package androidx.cursoradapter.widget {
+
+ public abstract class CursorAdapter extends android.widget.BaseAdapter implements android.widget.Filterable {
+ ctor @Deprecated public CursorAdapter(android.content.Context!, android.database.Cursor!);
+ ctor public CursorAdapter(android.content.Context!, android.database.Cursor!, boolean);
+ ctor public CursorAdapter(android.content.Context!, android.database.Cursor!, int);
+ method public abstract void bindView(android.view.View!, android.content.Context!, android.database.Cursor!);
+ method public void changeCursor(android.database.Cursor!);
+ method public CharSequence! convertToString(android.database.Cursor!);
+ method public int getCount();
+ method public android.database.Cursor! getCursor();
+ method public android.widget.Filter! getFilter();
+ method public android.widget.FilterQueryProvider! getFilterQueryProvider();
+ method public Object! getItem(int);
+ method public long getItemId(int);
+ method public android.view.View! getView(int, android.view.View!, android.view.ViewGroup!);
+ method @Deprecated protected void init(android.content.Context!, android.database.Cursor!, boolean);
+ method public android.view.View! newDropDownView(android.content.Context!, android.database.Cursor!, android.view.ViewGroup!);
+ method public abstract android.view.View! newView(android.content.Context!, android.database.Cursor!, android.view.ViewGroup!);
+ method protected void onContentChanged();
+ method public android.database.Cursor! runQueryOnBackgroundThread(CharSequence!);
+ method public void setFilterQueryProvider(android.widget.FilterQueryProvider!);
+ method public android.database.Cursor! swapCursor(android.database.Cursor!);
+ field @Deprecated public static final int FLAG_AUTO_REQUERY = 1; // 0x1
+ field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
+ }
+
+ public abstract class ResourceCursorAdapter extends androidx.cursoradapter.widget.CursorAdapter {
+ ctor @Deprecated public ResourceCursorAdapter(android.content.Context!, int, android.database.Cursor!);
+ ctor @Deprecated public ResourceCursorAdapter(android.content.Context!, int, android.database.Cursor!, boolean);
+ ctor public ResourceCursorAdapter(android.content.Context!, int, android.database.Cursor!, int);
+ method public android.view.View! newView(android.content.Context!, android.database.Cursor!, android.view.ViewGroup!);
+ method public void setDropDownViewResource(int);
+ method public void setViewResource(int);
+ }
+
+ public class SimpleCursorAdapter extends androidx.cursoradapter.widget.ResourceCursorAdapter {
+ ctor @Deprecated public SimpleCursorAdapter(android.content.Context!, int, android.database.Cursor!, String[]!, int[]!);
+ ctor public SimpleCursorAdapter(android.content.Context!, int, android.database.Cursor!, String[]!, int[]!, int);
+ method public void bindView(android.view.View!, android.content.Context!, android.database.Cursor!);
+ method public void changeCursorAndColumns(android.database.Cursor!, String[]!, int[]!);
+ method public androidx.cursoradapter.widget.SimpleCursorAdapter.CursorToStringConverter! getCursorToStringConverter();
+ method public int getStringConversionColumn();
+ method public androidx.cursoradapter.widget.SimpleCursorAdapter.ViewBinder! getViewBinder();
+ method public void setCursorToStringConverter(androidx.cursoradapter.widget.SimpleCursorAdapter.CursorToStringConverter!);
+ method public void setStringConversionColumn(int);
+ method public void setViewBinder(androidx.cursoradapter.widget.SimpleCursorAdapter.ViewBinder!);
+ method public void setViewImage(android.widget.ImageView!, String!);
+ method public void setViewText(android.widget.TextView!, String!);
+ }
+
+ public static interface SimpleCursorAdapter.CursorToStringConverter {
+ method public CharSequence! convertToString(android.database.Cursor!);
+ }
+
+ public static interface SimpleCursorAdapter.ViewBinder {
+ method public boolean setViewValue(android.view.View!, android.database.Cursor!, int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/cursoradapter/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to cursoradapter/api/res-1.1.0-alpha01.txt
diff --git a/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java b/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java
index 39f547f..8f875af 100644
--- a/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java
+++ b/cursoradapter/src/main/java/androidx/cursoradapter/widget/CursorAdapter.java
@@ -16,7 +16,7 @@
package androidx.cursoradapter.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.database.ContentObserver;
@@ -46,55 +46,55 @@
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected boolean mDataValid;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected boolean mAutoRequery;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected Cursor mCursor;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected Context mContext;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected int mRowIDColumn;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected ChangeObserver mChangeObserver;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected DataSetObserver mDataSetObserver;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected CursorFilter mCursorFilter;
/**
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected FilterQueryProvider mFilterQueryProvider;
/**
diff --git a/cursoradapter/src/main/java/androidx/cursoradapter/widget/SimpleCursorAdapter.java b/cursoradapter/src/main/java/androidx/cursoradapter/widget/SimpleCursorAdapter.java
index 20537fd..219b03d 100644
--- a/cursoradapter/src/main/java/androidx/cursoradapter/widget/SimpleCursorAdapter.java
+++ b/cursoradapter/src/main/java/androidx/cursoradapter/widget/SimpleCursorAdapter.java
@@ -16,7 +16,7 @@
package androidx.cursoradapter.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.database.Cursor;
@@ -40,14 +40,14 @@
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected int[] mFrom;
/**
* A list of View ids representing the views to which the data must be bound.
* This field should be made private, so it is hidden from the SDK.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected int[] mTo;
private int mStringConversionColumn = -1;
diff --git a/customview/api/1.1.0-alpha01.txt b/customview/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..d5249c0
--- /dev/null
+++ b/customview/api/1.1.0-alpha01.txt
@@ -0,0 +1,106 @@
+// Signature format: 3.0
+package androidx.customview.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, 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<androidx.customview.view.AbsSavedState>! CREATOR;
+ field public static final androidx.customview.view.AbsSavedState! EMPTY_STATE;
+ }
+
+}
+
+package androidx.customview.widget {
+
+ public abstract class ExploreByTouchHelper extends androidx.core.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 @Deprecated public 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(androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+ method protected abstract void onPopulateNodeForVirtualView(int, androidx.core.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 androidx.customview.widget.ViewDragHelper! create(android.view.ViewGroup, androidx.customview.widget.ViewDragHelper.Callback);
+ method public static androidx.customview.widget.ViewDragHelper! create(android.view.ViewGroup, float, androidx.customview.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 @Px public int getEdgeSize();
+ method public float getMinVelocity();
+ method @Px 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 abstract static 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, @Px int, @Px int);
+ method public void onViewReleased(android.view.View, float, float);
+ method public abstract boolean tryCaptureView(android.view.View, int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/customview/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to customview/api/res-1.1.0-alpha01.txt
diff --git a/development/update_library_versions.py b/development/update_library_versions.py
index 5fff9cc..1f2ba6b 100755
--- a/development/update_library_versions.py
+++ b/development/update_library_versions.py
@@ -159,6 +159,9 @@
else:
return version, changed
+def artifactId_to_kotlin_macro(artifactId):
+ return artifactId.replace('-','_').upper()
+
def update_artifact_version(lv_lines, artifact):
num_lines = len(lv_lines)
for i in range(num_lines):
@@ -170,7 +173,7 @@
new_version, ver_was_updated = increment_alpha_beta_version(artifact.version)
if ver_was_updated:
# Only modify line if the version was actually changed
- lv_lines[i] =" val " + artifactId.upper() + " = Version(\"" + new_version + "\")\n"
+ lv_lines[i] =" val " + artifactId_to_kotlin_macro(artifactId) + " = Version(\"" + new_version + "\")\n"
summary_log.append("Updated %s to FROM %s TO %s" % (artifactId.upper(), artifact.version, new_version))
# Assert incremented version doesn't exist
if does_exist_on_gmaven(artifact.groupId, artifact.artifactId, new_version):
diff --git a/documentfile/api/1.1.0-alpha01.txt b/documentfile/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..0571177
--- /dev/null
+++ b/documentfile/api/1.1.0-alpha01.txt
@@ -0,0 +1,30 @@
+// Signature format: 3.0
+package androidx.documentfile.provider {
+
+ public abstract class DocumentFile {
+ method public abstract boolean canRead();
+ method public abstract boolean canWrite();
+ method public abstract androidx.documentfile.provider.DocumentFile? createDirectory(String);
+ method public abstract androidx.documentfile.provider.DocumentFile? createFile(String, String);
+ method public abstract boolean delete();
+ method public abstract boolean exists();
+ method public androidx.documentfile.provider.DocumentFile? findFile(String);
+ method public static androidx.documentfile.provider.DocumentFile fromFile(java.io.File);
+ method public static androidx.documentfile.provider.DocumentFile? fromSingleUri(android.content.Context, android.net.Uri);
+ method public static androidx.documentfile.provider.DocumentFile? fromTreeUri(android.content.Context, android.net.Uri);
+ method public abstract String? getName();
+ method public androidx.documentfile.provider.DocumentFile? getParentFile();
+ method public abstract 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 androidx.documentfile.provider.DocumentFile[] listFiles();
+ method public abstract boolean renameTo(String);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/documentfile/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to documentfile/api/res-1.1.0-alpha01.txt
diff --git a/drawerlayout/api/1.1.0-alpha01.txt b/drawerlayout/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..da9d098
--- /dev/null
+++ b/drawerlayout/api/1.1.0-alpha01.txt
@@ -0,0 +1,82 @@
+// Signature format: 3.0
+package androidx.drawerlayout.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(androidx.drawerlayout.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 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(androidx.drawerlayout.widget.DrawerLayout.DrawerListener);
+ method public void setDrawerElevation(float);
+ method @Deprecated public void setDrawerListener(androidx.drawerlayout.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(@DrawableRes int, int);
+ method public void setDrawerTitle(int, CharSequence?);
+ method public void setScrimColor(@ColorInt int);
+ method public void setStatusBarBackground(android.graphics.drawable.Drawable?);
+ method public void setStatusBarBackground(int);
+ method public void setStatusBarBackgroundColor(@ColorInt 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 interface DrawerLayout.DrawerListener {
+ 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 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(androidx.drawerlayout.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 androidx.customview.view.AbsSavedState {
+ ctor public DrawerLayout.SavedState(android.os.Parcel, ClassLoader?);
+ ctor public DrawerLayout.SavedState(android.os.Parcelable);
+ field public static final android.os.Parcelable.Creator<androidx.drawerlayout.widget.DrawerLayout.SavedState>! CREATOR;
+ }
+
+ public abstract static class DrawerLayout.SimpleDrawerListener implements androidx.drawerlayout.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/savedstate/bundle/api/res-1.0.0-alpha01.txt b/drawerlayout/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to drawerlayout/api/res-1.1.0-alpha01.txt
diff --git a/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java b/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
index 22e61b9..833f0e9 100644
--- a/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
+++ b/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
@@ -17,7 +17,7 @@
package androidx.drawerlayout.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -399,7 +399,7 @@
* @hide Internal use only; called to apply window insets when configured
* with fitsSystemWindows="true"
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setChildInsets(Object insets, boolean draw) {
mLastInsets = insets;
mDrawStatusBarBackground = draw;
diff --git a/dynamic-animation/api/1.1.0-alpha01.txt b/dynamic-animation/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..9a947b0
--- /dev/null
+++ b/dynamic-animation/api/1.1.0-alpha01.txt
@@ -0,0 +1,104 @@
+// Signature format: 3.0
+package androidx.dynamicanimation.animation {
+
+ public abstract class DynamicAnimation<T extends androidx.dynamicanimation.animation.DynamicAnimation<T>> {
+ method public T! addEndListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationEndListener!);
+ method public T! addUpdateListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationUpdateListener!);
+ method public void cancel();
+ method public float getMinimumVisibleChange();
+ method public boolean isRunning();
+ method public void removeEndListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationEndListener!);
+ method public void removeUpdateListener(androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationUpdateListener!);
+ method public T! setMaxValue(float);
+ method public T! setMinValue(float);
+ method public T! setMinimumVisibleChange(@FloatRange(from=0.0, fromInclusive=false) float);
+ method public T! setStartValue(float);
+ method public T! setStartVelocity(float);
+ method public void start();
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ALPHA;
+ field public static final float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
+ field public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
+ field public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
+ field public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ROTATION;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ROTATION_X;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! ROTATION_Y;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCALE_X;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCALE_Y;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCROLL_X;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! SCROLL_Y;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! TRANSLATION_X;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! TRANSLATION_Y;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! TRANSLATION_Z;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! X;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! Y;
+ field public static final androidx.dynamicanimation.animation.DynamicAnimation.ViewProperty! Z;
+ }
+
+ public static interface DynamicAnimation.OnAnimationEndListener {
+ method public void onAnimationEnd(androidx.dynamicanimation.animation.DynamicAnimation!, boolean, float, float);
+ }
+
+ public static interface DynamicAnimation.OnAnimationUpdateListener {
+ method public void onAnimationUpdate(androidx.dynamicanimation.animation.DynamicAnimation!, float, float);
+ }
+
+ public abstract static class DynamicAnimation.ViewProperty extends androidx.dynamicanimation.animation.FloatPropertyCompat<android.view.View> {
+ }
+
+ public final class FlingAnimation extends androidx.dynamicanimation.animation.DynamicAnimation<androidx.dynamicanimation.animation.FlingAnimation> {
+ ctor public FlingAnimation(androidx.dynamicanimation.animation.FloatValueHolder!);
+ ctor public FlingAnimation(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K>!);
+ method public float getFriction();
+ method public androidx.dynamicanimation.animation.FlingAnimation! setFriction(@FloatRange(from=0.0, fromInclusive=false) float);
+ method public androidx.dynamicanimation.animation.FlingAnimation! setMaxValue(float);
+ method public androidx.dynamicanimation.animation.FlingAnimation! setMinValue(float);
+ method public androidx.dynamicanimation.animation.FlingAnimation! setStartVelocity(float);
+ }
+
+ public abstract class FloatPropertyCompat<T> {
+ ctor public FloatPropertyCompat(String!);
+ method @RequiresApi(24) public static <T> androidx.dynamicanimation.animation.FloatPropertyCompat<T>! createFloatPropertyCompat(android.util.FloatProperty<T>!);
+ method public abstract float getValue(T!);
+ method public abstract void setValue(T!, float);
+ }
+
+ public final class FloatValueHolder {
+ ctor public FloatValueHolder();
+ ctor public FloatValueHolder(float);
+ method public float getValue();
+ method public void setValue(float);
+ }
+
+ public final class SpringAnimation extends androidx.dynamicanimation.animation.DynamicAnimation<androidx.dynamicanimation.animation.SpringAnimation> {
+ ctor public SpringAnimation(androidx.dynamicanimation.animation.FloatValueHolder!);
+ ctor public SpringAnimation(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K>!);
+ ctor public SpringAnimation(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K>!, float);
+ method public void animateToFinalPosition(float);
+ method public boolean canSkipToEnd();
+ method public androidx.dynamicanimation.animation.SpringForce! getSpring();
+ method public androidx.dynamicanimation.animation.SpringAnimation! setSpring(androidx.dynamicanimation.animation.SpringForce!);
+ method public void skipToEnd();
+ }
+
+ public final class SpringForce {
+ ctor public SpringForce();
+ ctor public SpringForce(float);
+ method public float getDampingRatio();
+ method public float getFinalPosition();
+ method public float getStiffness();
+ method public androidx.dynamicanimation.animation.SpringForce! setDampingRatio(@FloatRange(from=0.0) float);
+ method public androidx.dynamicanimation.animation.SpringForce! setFinalPosition(float);
+ method public androidx.dynamicanimation.animation.SpringForce! setStiffness(@FloatRange(from=0.0, fromInclusive=false) float);
+ field public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f;
+ field public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f;
+ field public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f;
+ field public static final float DAMPING_RATIO_NO_BOUNCY = 1.0f;
+ field public static final float STIFFNESS_HIGH = 10000.0f;
+ field public static final float STIFFNESS_LOW = 200.0f;
+ field public static final float STIFFNESS_MEDIUM = 1500.0f;
+ field public static final float STIFFNESS_VERY_LOW = 50.0f;
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/dynamic-animation/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to dynamic-animation/api/res-1.1.0-alpha01.txt
diff --git a/dynamic-animation/ktx/api/1.0.0-alpha02.txt b/dynamic-animation/ktx/api/1.0.0-alpha02.txt
new file mode 100644
index 0000000..cda5dad
--- /dev/null
+++ b/dynamic-animation/ktx/api/1.0.0-alpha02.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.dynamicanimation.animation {
+
+ public final class DynamicAnimationKt {
+ ctor public DynamicAnimationKt();
+ method public static inline <K> androidx.dynamicanimation.animation.FlingAnimation flingAnimationOf(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K> property);
+ method public static inline <K> androidx.dynamicanimation.animation.SpringAnimation springAnimationOf(K!, androidx.dynamicanimation.animation.FloatPropertyCompat<K> property, float finalPosition = Float.NaN);
+ method public static inline androidx.dynamicanimation.animation.SpringAnimation withSpringForceProperties(androidx.dynamicanimation.animation.SpringAnimation, kotlin.jvm.functions.Function1<? super androidx.dynamicanimation.animation.SpringForce,kotlin.Unit> func);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/dynamic-animation/ktx/api/res-1.0.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to dynamic-animation/ktx/api/res-1.0.0-alpha02.txt
diff --git a/emoji/appcompat/api/1.1.0-alpha01.txt b/emoji/appcompat/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..a164fb7
--- /dev/null
+++ b/emoji/appcompat/api/1.1.0-alpha01.txt
@@ -0,0 +1,25 @@
+// Signature format: 3.0
+package androidx.emoji.widget {
+
+ public class EmojiAppCompatButton extends androidx.appcompat.widget.AppCompatButton {
+ ctor public EmojiAppCompatButton(android.content.Context!);
+ ctor public EmojiAppCompatButton(android.content.Context!, android.util.AttributeSet!);
+ ctor public EmojiAppCompatButton(android.content.Context!, android.util.AttributeSet!, int);
+ }
+
+ public class EmojiAppCompatEditText extends androidx.appcompat.widget.AppCompatEditText {
+ ctor public EmojiAppCompatEditText(android.content.Context!);
+ ctor public EmojiAppCompatEditText(android.content.Context!, android.util.AttributeSet!);
+ ctor public EmojiAppCompatEditText(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getMaxEmojiCount();
+ method public void setMaxEmojiCount(@IntRange(from=0) int);
+ }
+
+ public class EmojiAppCompatTextView extends androidx.appcompat.widget.AppCompatTextView {
+ ctor public EmojiAppCompatTextView(android.content.Context!);
+ ctor public EmojiAppCompatTextView(android.content.Context!, android.util.AttributeSet!);
+ ctor public EmojiAppCompatTextView(android.content.Context!, android.util.AttributeSet!, int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/emoji/appcompat/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to emoji/appcompat/api/res-1.1.0-alpha01.txt
diff --git a/emoji/bundled/api/1.1.0-alpha01.txt b/emoji/bundled/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..7fe3afc
--- /dev/null
+++ b/emoji/bundled/api/1.1.0-alpha01.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.emoji.bundled {
+
+ public class BundledEmojiCompatConfig extends androidx.emoji.text.EmojiCompat.Config {
+ ctor public BundledEmojiCompatConfig(android.content.Context);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/emoji/bundled/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to emoji/bundled/api/res-1.1.0-alpha01.txt
diff --git a/emoji/core/api/1.1.0-alpha01.txt b/emoji/core/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..4f5d70e
--- /dev/null
+++ b/emoji/core/api/1.1.0-alpha01.txt
@@ -0,0 +1,142 @@
+// Signature format: 3.0
+package androidx.emoji.text {
+
+ @AnyThread public class EmojiCompat {
+ method public static androidx.emoji.text.EmojiCompat! get();
+ method public String getAssetSignature();
+ method public int getLoadState();
+ method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+ method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent!);
+ method public boolean hasEmojiGlyph(CharSequence);
+ method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+ method public static androidx.emoji.text.EmojiCompat! init(androidx.emoji.text.EmojiCompat.Config);
+ method public void load();
+ method @CheckResult public CharSequence! process(CharSequence);
+ method @CheckResult public CharSequence! process(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int);
+ method @CheckResult public CharSequence! process(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+ method @CheckResult public CharSequence! process(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+ method public void registerInitCallback(androidx.emoji.text.EmojiCompat.InitCallback);
+ method public void unregisterInitCallback(androidx.emoji.text.EmojiCompat.InitCallback);
+ field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+ field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+ field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+ field public static final int LOAD_STATE_FAILED = 2; // 0x2
+ field public static final int LOAD_STATE_LOADING = 0; // 0x0
+ field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+ field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+ field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+ field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+ field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+ field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+ }
+
+ public abstract static class EmojiCompat.Config {
+ ctor protected EmojiCompat.Config(androidx.emoji.text.EmojiCompat.MetadataRepoLoader);
+ method protected final androidx.emoji.text.EmojiCompat.MetadataRepoLoader! getMetadataRepoLoader();
+ method public androidx.emoji.text.EmojiCompat.Config! registerInitCallback(androidx.emoji.text.EmojiCompat.InitCallback);
+ method public androidx.emoji.text.EmojiCompat.Config! setEmojiSpanIndicatorColor(@ColorInt int);
+ method public androidx.emoji.text.EmojiCompat.Config! setEmojiSpanIndicatorEnabled(boolean);
+ method public androidx.emoji.text.EmojiCompat.Config! setMetadataLoadStrategy(int);
+ method public androidx.emoji.text.EmojiCompat.Config! setReplaceAll(boolean);
+ method public androidx.emoji.text.EmojiCompat.Config! setUseEmojiAsDefaultStyle(boolean);
+ method public androidx.emoji.text.EmojiCompat.Config! setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer>?);
+ method public androidx.emoji.text.EmojiCompat.Config! unregisterInitCallback(androidx.emoji.text.EmojiCompat.InitCallback);
+ }
+
+ public abstract static class EmojiCompat.InitCallback {
+ ctor public EmojiCompat.InitCallback();
+ method public void onFailed(Throwable?);
+ method public void onInitialized();
+ }
+
+ public static interface EmojiCompat.MetadataRepoLoader {
+ method public void load(androidx.emoji.text.EmojiCompat.MetadataRepoLoaderCallback);
+ }
+
+ public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+ ctor public EmojiCompat.MetadataRepoLoaderCallback();
+ method public abstract void onFailed(Throwable?);
+ method public abstract void onLoaded(androidx.emoji.text.MetadataRepo);
+ }
+
+ @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+ method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt!);
+ }
+
+ public class FontRequestEmojiCompatConfig extends androidx.emoji.text.EmojiCompat.Config {
+ ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+ method public androidx.emoji.text.FontRequestEmojiCompatConfig! setHandler(android.os.Handler!);
+ method public androidx.emoji.text.FontRequestEmojiCompatConfig! setRetryPolicy(androidx.emoji.text.FontRequestEmojiCompatConfig.RetryPolicy!);
+ }
+
+ public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji.text.FontRequestEmojiCompatConfig.RetryPolicy {
+ ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+ method public long getRetryDelay();
+ }
+
+ public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+ ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+ method public abstract long getRetryDelay();
+ }
+
+ @AnyThread @RequiresApi(19) public final class MetadataRepo {
+ method public static androidx.emoji.text.MetadataRepo! create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+ method public static androidx.emoji.text.MetadataRepo! create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+ method public static androidx.emoji.text.MetadataRepo! create(android.content.res.AssetManager, String!) throws java.io.IOException;
+ }
+
+}
+
+package androidx.emoji.widget {
+
+ public class EmojiButton extends android.widget.Button {
+ ctor public EmojiButton(android.content.Context!);
+ ctor public EmojiButton(android.content.Context!, android.util.AttributeSet!);
+ ctor public EmojiButton(android.content.Context!, android.util.AttributeSet!, int);
+ ctor @RequiresApi(android.os.Build.VERSION_CODES.LOLLIPOP) public EmojiButton(android.content.Context!, android.util.AttributeSet!, int, int);
+ }
+
+ public class EmojiEditText extends android.widget.EditText {
+ ctor public EmojiEditText(android.content.Context!);
+ ctor public EmojiEditText(android.content.Context!, android.util.AttributeSet!);
+ ctor public EmojiEditText(android.content.Context!, android.util.AttributeSet!, int);
+ ctor @RequiresApi(android.os.Build.VERSION_CODES.LOLLIPOP) public EmojiEditText(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public int getMaxEmojiCount();
+ method public void setMaxEmojiCount(@IntRange(from=0) int);
+ }
+
+ public final class EmojiEditTextHelper {
+ ctor public EmojiEditTextHelper(android.widget.EditText);
+ method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+ method public int getMaxEmojiCount();
+ method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+ method public void setMaxEmojiCount(@IntRange(from=0) int);
+ }
+
+ public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+ ctor public EmojiExtractTextLayout(android.content.Context!);
+ ctor public EmojiExtractTextLayout(android.content.Context!, android.util.AttributeSet?);
+ ctor public EmojiExtractTextLayout(android.content.Context!, android.util.AttributeSet?, int);
+ ctor @RequiresApi(api=android.os.Build.VERSION_CODES.LOLLIPOP) public EmojiExtractTextLayout(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public int getEmojiReplaceStrategy();
+ method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService!, android.view.inputmethod.EditorInfo!);
+ method public void setEmojiReplaceStrategy(int);
+ }
+
+ public class EmojiTextView extends android.widget.TextView {
+ ctor public EmojiTextView(android.content.Context!);
+ ctor public EmojiTextView(android.content.Context!, android.util.AttributeSet!);
+ ctor public EmojiTextView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor @RequiresApi(api=android.os.Build.VERSION_CODES.LOLLIPOP) public EmojiTextView(android.content.Context!, android.util.AttributeSet!, int, int);
+ }
+
+ public final class EmojiTextViewHelper {
+ ctor public EmojiTextViewHelper(android.widget.TextView);
+ method public android.text.InputFilter[] getFilters(android.text.InputFilter[]);
+ method public void setAllCaps(boolean);
+ method public void updateTransformationMethod();
+ method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+ }
+
+}
+
diff --git a/emoji/core/api/res-1.1.0-alpha01.txt b/emoji/core/api/res-1.1.0-alpha01.txt
new file mode 100644
index 0000000..8bc8423
--- /dev/null
+++ b/emoji/core/api/res-1.1.0-alpha01.txt
@@ -0,0 +1,2 @@
+attr emojiReplaceStrategy
+attr maxEmojiCount
diff --git a/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java b/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java
index 9e4b58b..de9bb19 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/EmojiCompat.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Color;
import android.os.Build;
@@ -129,7 +129,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({LOAD_STATE_DEFAULT, LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, LOAD_STATE_FAILED})
@Retention(RetentionPolicy.SOURCE)
public @interface LoadState {
@@ -157,7 +157,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({REPLACE_STRATEGY_DEFAULT, REPLACE_STRATEGY_NON_EXISTENT, REPLACE_STRATEGY_ALL})
@Retention(RetentionPolicy.SOURCE)
public @interface ReplaceStrategy {
@@ -181,7 +181,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({LOAD_STRATEGY_DEFAULT, LOAD_STRATEGY_MANUAL})
@Retention(RetentionPolicy.SOURCE)
public @interface LoadStrategy {
@@ -190,7 +190,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
static final int EMOJI_COUNT_UNLIMITED = Integer.MAX_VALUE;
private static final Object sInstanceLock = new Object();
@@ -309,7 +309,7 @@
* @hide
*/
@SuppressWarnings("GuardedBy")
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
public static EmojiCompat reset(@NonNull final Config config) {
synchronized (sInstanceLock) {
@@ -324,7 +324,7 @@
* @hide
*/
@SuppressWarnings("GuardedBy")
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
public static EmojiCompat reset(final EmojiCompat emojiCompat) {
synchronized (sInstanceLock) {
@@ -338,7 +338,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
void setGlyphChecker(@NonNull final EmojiProcessor.GlyphChecker glyphChecker) {
mHelper.setGlyphChecker(glyphChecker);
@@ -506,7 +506,7 @@
* @return whether a background should be drawn for the emoji.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
boolean isEmojiSpanIndicatorEnabled() {
return mEmojiSpanIndicatorEnabled;
}
@@ -515,7 +515,7 @@
* @return whether a background should be drawn for the emoji.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ColorInt int getEmojiSpanIndicatorColor() {
return mEmojiSpanIndicatorColor;
}
@@ -803,7 +803,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void updateEditorInfoAttrs(@NonNull final EditorInfo outAttrs) {
//noinspection ConstantConditions
if (isInitialized() && outAttrs != null && outAttrs.extras != null) {
@@ -816,7 +816,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
static class SpanFactory {
/**
diff --git a/emoji/core/src/main/java/androidx/emoji/text/EmojiMetadata.java b/emoji/core/src/main/java/androidx/emoji/text/EmojiMetadata.java
index 64cde41..ea0a187 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/EmojiMetadata.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/EmojiMetadata.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -38,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@AnyThread
@RequiresApi(19)
public class EmojiMetadata {
diff --git a/emoji/core/src/main/java/androidx/emoji/text/EmojiProcessor.java b/emoji/core/src/main/java/androidx/emoji/text/EmojiProcessor.java
index 536eb9b..51dcc116 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/EmojiProcessor.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/EmojiProcessor.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Build;
import android.text.Editable;
@@ -51,7 +51,7 @@
* @hide
*/
@AnyThread
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
final class EmojiProcessor {
@@ -787,7 +787,7 @@
* @hide
*/
@AnyThread
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class GlyphChecker {
/**
* Default text size for {@link #mTextPaint}.
diff --git a/emoji/core/src/main/java/androidx/emoji/text/EmojiSpan.java b/emoji/core/src/main/java/androidx/emoji/text/EmojiSpan.java
index 95480fd..9ca9ee6 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/EmojiSpan.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/EmojiSpan.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Paint;
import android.text.style.ReplacementSpan;
@@ -67,7 +67,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
EmojiSpan(@NonNull final EmojiMetadata metadata) {
Preconditions.checkNotNull(metadata, "metadata cannot be null");
mMetadata = metadata;
@@ -96,7 +96,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
final EmojiMetadata getMetadata() {
return mMetadata;
}
@@ -106,7 +106,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
final int getWidth() {
return mWidth;
}
@@ -116,7 +116,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
final int getHeight() {
return mHeight;
}
@@ -124,7 +124,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
final float getRatio() {
return mRatio;
}
@@ -134,7 +134,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
public final int getId() {
return getMetadata().getId();
diff --git a/emoji/core/src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java b/emoji/core/src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java
index 99ac85f..b985dab 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/FontRequestEmojiCompatConfig.java
@@ -123,7 +123,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public FontRequestEmojiCompatConfig(@NonNull Context context, @NonNull FontRequest request,
@NonNull FontProviderHelper fontProviderHelper) {
super(new FontRequestMetadataLoader(context, request, fontProviderHelper));
@@ -329,7 +329,7 @@
* Delegate class for mocking FontsContractCompat.fetchFonts.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static class FontProviderHelper {
/** Calls FontsContractCompat.fetchFonts. */
public FontFamilyResult fetchFonts(@NonNull Context context,
diff --git a/emoji/core/src/main/java/androidx/emoji/text/MetadataListReader.java b/emoji/core/src/main/java/androidx/emoji/text/MetadataListReader.java
index 705650c3..fc09518 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/MetadataListReader.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/MetadataListReader.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.AssetManager;
@@ -35,7 +35,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@AnyThread
@RequiresApi(19)
class MetadataListReader {
diff --git a/emoji/core/src/main/java/androidx/emoji/text/MetadataRepo.java b/emoji/core/src/main/java/androidx/emoji/text/MetadataRepo.java
index 5f8b1be..0c5bb01 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/MetadataRepo.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/MetadataRepo.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.AssetManager;
import android.graphics.Typeface;
@@ -70,7 +70,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
MetadataRepo() {
mTypeface = null;
mMetadataList = null;
@@ -148,7 +148,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Typeface getTypeface() {
return mTypeface;
}
@@ -156,7 +156,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
int getMetadataVersion() {
return mMetadataList.version();
}
@@ -164,7 +164,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Node getRootNode() {
return mRootNode;
}
@@ -172,7 +172,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public char[] getEmojiCharArray() {
return mEmojiCharArray;
}
@@ -180,7 +180,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MetadataList getMetadataList() {
return mMetadataList;
}
@@ -190,7 +190,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting
void put(@NonNull final EmojiMetadata data) {
Preconditions.checkNotNull(data, "emoji metadata cannot be null");
@@ -206,7 +206,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
static class Node {
private final SparseArray<Node> mChildren;
private EmojiMetadata mData;
diff --git a/emoji/core/src/main/java/androidx/emoji/text/TypefaceEmojiSpan.java b/emoji/core/src/main/java/androidx/emoji/text/TypefaceEmojiSpan.java
index 601d20d..cb0a3e0 100644
--- a/emoji/core/src/main/java/androidx/emoji/text/TypefaceEmojiSpan.java
+++ b/emoji/core/src/main/java/androidx/emoji/text/TypefaceEmojiSpan.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.text;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -31,7 +31,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public final class TypefaceEmojiSpan extends EmojiSpan {
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EditTextAttributeHelper.java b/emoji/core/src/main/java/androidx/emoji/widget/EditTextAttributeHelper.java
index 8f588ce..db5e0df 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EditTextAttributeHelper.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EditTextAttributeHelper.java
@@ -16,7 +16,7 @@
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class EditTextAttributeHelper {
static final int MAX_EMOJI_COUNT = Integer.MAX_VALUE;
private int mMaxEmojiCount;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiEditTextHelper.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiEditTextHelper.java
index d140623..fbc30f5 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiEditTextHelper.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiEditTextHelper.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Build;
import android.text.method.KeyListener;
@@ -158,7 +158,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
mEmojiReplaceStrategy = replaceStrategy;
mHelper.setEmojiReplaceStrategy(replaceStrategy);
@@ -173,7 +173,7 @@
* {@link EmojiCompat#REPLACE_STRATEGY_ALL}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
int getEmojiReplaceStrategy() {
return mEmojiReplaceStrategy;
}
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiExtractEditText.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiExtractEditText.java
index 1279d71..39f7125 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiExtractEditText.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiExtractEditText.java
@@ -16,7 +16,7 @@
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.inputmethodservice.ExtractEditText;
@@ -43,7 +43,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class EmojiExtractEditText extends ExtractEditText {
private EmojiEditTextHelper mEmojiEditTextHelper;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputConnection.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputConnection.java
index e51d248..6c95d11 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputConnection.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputConnection.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.text.Editable;
import android.view.inputmethod.EditorInfo;
@@ -37,7 +37,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
final class EmojiInputConnection extends InputConnectionWrapper {
private final TextView mTextView;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java
index b44e859..b3af99b 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiInputFilter.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.text.Selection;
import android.text.Spannable;
@@ -40,7 +40,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
final class EmojiInputFilter implements android.text.InputFilter {
private final TextView mTextView;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiKeyListener.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiKeyListener.java
index d1de3fb..0efb06c 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiKeyListener.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiKeyListener.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.text.Editable;
import android.view.KeyEvent;
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
final class EmojiKeyListener implements android.text.method.KeyListener {
private final android.text.method.KeyListener mKeyListener;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java
index 2197aff..f35ea4d 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTextWatcher.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.text.Editable;
import android.text.Selection;
@@ -35,7 +35,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
final class EmojiTextWatcher implements android.text.TextWatcher {
private final EditText mEditText;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java
index 81fe615..b875d61 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/EmojiTransformationMethod.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.text.method.TransformationMethod;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
class EmojiTransformationMethod implements TransformationMethod {
private final TransformationMethod mTransformationMethod;
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/ExtractButtonCompat.java b/emoji/core/src/main/java/androidx/emoji/widget/ExtractButtonCompat.java
index 813585c..bfb96f1 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/ExtractButtonCompat.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/ExtractButtonCompat.java
@@ -16,7 +16,7 @@
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.os.Build;
@@ -33,7 +33,7 @@
* inflating {@link EmojiExtractEditText} for keyboard use.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ExtractButtonCompat extends Button {
public ExtractButtonCompat(Context context) {
super(context, null);
diff --git a/emoji/core/src/main/java/androidx/emoji/widget/SpannableBuilder.java b/emoji/core/src/main/java/androidx/emoji/widget/SpannableBuilder.java
index 5813758..c182b0f 100644
--- a/emoji/core/src/main/java/androidx/emoji/widget/SpannableBuilder.java
+++ b/emoji/core/src/main/java/androidx/emoji/widget/SpannableBuilder.java
@@ -15,7 +15,7 @@
*/
package androidx.emoji.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.text.Editable;
import android.text.SpanWatcher;
@@ -48,7 +48,7 @@
* @hide
* @see EmojiEditableFactory
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class SpannableBuilder extends SpannableStringBuilder {
/**
* DynamicLayout$ChangeWatcher class.
@@ -63,7 +63,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
SpannableBuilder(@NonNull Class<?> watcherClass) {
Preconditions.checkNotNull(watcherClass, "watcherClass cannot be null");
mWatcherClass = watcherClass;
@@ -72,7 +72,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
SpannableBuilder(@NonNull Class<?> watcherClass, @NonNull CharSequence text) {
super(text);
Preconditions.checkNotNull(watcherClass, "watcherClass cannot be null");
@@ -82,7 +82,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
SpannableBuilder(@NonNull Class<?> watcherClass, @NonNull CharSequence text, int start,
int end) {
super(text, start, end);
@@ -93,7 +93,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
static SpannableBuilder create(@NonNull Class<?> clazz, @NonNull CharSequence text) {
return new SpannableBuilder(clazz, text);
}
@@ -255,7 +255,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void beginBatchEdit() {
blockWatchers();
}
@@ -263,7 +263,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void endBatchEdit() {
unblockwatchers();
fireWatchers();
diff --git a/enterprise/feedback/api/1.0.0-alpha01.txt b/enterprise/feedback/api/1.0.0-alpha01.txt
index 5a876d5..037c6e4 100644
--- a/enterprise/feedback/api/1.0.0-alpha01.txt
+++ b/enterprise/feedback/api/1.0.0-alpha01.txt
@@ -24,6 +24,7 @@
public class KeyedAppStatesReporter {
method public static androidx.enterprise.feedback.KeyedAppStatesReporter getInstance(android.content.Context);
+ method public static void initialize(android.content.Context, java.util.concurrent.Executor);
method public void set(java.util.Collection<androidx.enterprise.feedback.KeyedAppState>);
method public void setImmediate(java.util.Collection<androidx.enterprise.feedback.KeyedAppState>);
field public static final String APP_STATES_ACTION = "androidx.enterprise.feedback.action.APP_STATES";
diff --git a/enterprise/feedback/api/current.txt b/enterprise/feedback/api/current.txt
index 5a876d5..037c6e4 100644
--- a/enterprise/feedback/api/current.txt
+++ b/enterprise/feedback/api/current.txt
@@ -24,6 +24,7 @@
public class KeyedAppStatesReporter {
method public static androidx.enterprise.feedback.KeyedAppStatesReporter getInstance(android.content.Context);
+ method public static void initialize(android.content.Context, java.util.concurrent.Executor);
method public void set(java.util.Collection<androidx.enterprise.feedback.KeyedAppState>);
method public void setImmediate(java.util.Collection<androidx.enterprise.feedback.KeyedAppState>);
field public static final String APP_STATES_ACTION = "androidx.enterprise.feedback.action.APP_STATES";
diff --git a/enterprise/feedback/build.gradle b/enterprise/feedback/build.gradle
index 07f7eb1..01318c7 100644
--- a/enterprise/feedback/build.gradle
+++ b/enterprise/feedback/build.gradle
@@ -24,7 +24,7 @@
}
supportLibrary {
name = "Enterprise Feedback"
- publish = false
+ publish = true
mavenVersion = LibraryVersions.ENTERPRISE
mavenGroup = LibraryGroups.ENTERPRISE
inceptionYear = "2019"
diff --git a/enterprise/feedback/src/main/java/androidx/enterprise/feedback/BufferedServiceConnection.java b/enterprise/feedback/src/main/java/androidx/enterprise/feedback/BufferedServiceConnection.java
index a6e8af6..fb3a361 100644
--- a/enterprise/feedback/src/main/java/androidx/enterprise/feedback/BufferedServiceConnection.java
+++ b/enterprise/feedback/src/main/java/androidx/enterprise/feedback/BufferedServiceConnection.java
@@ -33,6 +33,7 @@
import java.util.ArrayDeque;
import java.util.Queue;
+import java.util.concurrent.Executor;
/**
* A wrapper around {@link ServiceConnection} and {@link Messenger} which will buffer messages sent
@@ -40,6 +41,8 @@
*
* <p>Each instance is single-use. After being unbound either manually (using {@link #unbind()} or
* due to an error it will become "dead" (see {@link #isDead()} and cannot be used further.
+ *
+ * <p>Instances are not thread safe, so avoid using on multiple different threads.
*/
class BufferedServiceConnection {
@@ -61,14 +64,27 @@
private boolean mHasBound = false;
@SuppressWarnings("WeakerAccess") /* synthetic access */
final Queue<Message> mBuffer = new ArrayDeque<>();
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ final Executor mExecutor;
- BufferedServiceConnection(Context context, Intent bindIntent, int flags) {
+ /**
+ * Create a {@link BufferedServiceConnection}.
+ *
+ * <p>The {@link Executor} must execute serially on the same thread as all calls to
+ * this instance.
+ */
+ BufferedServiceConnection(
+ Executor executor, Context context, Intent bindIntent, int flags) {
+ if (executor == null) {
+ throw new NullPointerException("executor must not be null");
+ }
if (context == null) {
- throw new NullPointerException("Context must not be null");
+ throw new NullPointerException("context must not be null");
}
if (bindIntent == null) {
throw new NullPointerException("bindIntent must not be null");
}
+ this.mExecutor = executor;
this.mContext = context;
this.mBindIntent = bindIntent;
this.mFlags = flags;
@@ -92,29 +108,45 @@
}
void unbind() {
- mContext.unbindService(mConnection);
+ if (!mHasBound) {
+ throw new IllegalStateException("bindService must be called before unbind");
+ }
mIsDead = true;
+ mContext.unbindService(mConnection);
}
private final ServiceConnection mConnection =
new ServiceConnection() {
@Override
public void onBindingDied(ComponentName name) {
- mIsDead = true;
+ mExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ mIsDead = true;
+ }
+ });
}
@Override
- public void onServiceConnected(ComponentName componentName, IBinder service) {
- mHasBeenDisconnected = false;
- if (canPackageReceiveAppStates(mContext, componentName.getPackageName())) {
- mMessenger = new Messenger(service);
- sendBufferedMessages();
- } else {
- mIsDead = true;
- }
+ public void onServiceConnected(final ComponentName componentName,
+ final IBinder service) {
+ mExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ mHasBeenDisconnected = false;
+ if (canPackageReceiveAppStates(
+ mContext, componentName.getPackageName())) {
+ mMessenger = new Messenger(service);
+ sendBufferedMessages();
+ } else {
+ mIsDead = true;
+ }
+ }
+ });
}
- private void sendBufferedMessages() {
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ void sendBufferedMessages() {
while (!mBuffer.isEmpty()) {
trySendMessage(mBuffer.poll());
}
@@ -122,8 +154,13 @@
@Override
public void onServiceDisconnected(ComponentName componentName) {
- mHasBeenDisconnected = true;
- mMessenger = null;
+ mExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ mHasBeenDisconnected = true;
+ mMessenger = null;
+ }
+ });
}
};
diff --git a/enterprise/feedback/src/main/java/androidx/enterprise/feedback/KeyedAppStatesReporter.java b/enterprise/feedback/src/main/java/androidx/enterprise/feedback/KeyedAppStatesReporter.java
index 6e0bc15..56bd8fe 100644
--- a/enterprise/feedback/src/main/java/androidx/enterprise/feedback/KeyedAppStatesReporter.java
+++ b/enterprise/feedback/src/main/java/androidx/enterprise/feedback/KeyedAppStatesReporter.java
@@ -27,20 +27,23 @@
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
/**
* A reporter of keyed app states to enable communication between an app and an EMM (enterprise
@@ -102,6 +105,44 @@
private final Map<String, BufferedServiceConnection> mServiceConnections = new HashMap<>();
+ private static final int EXECUTOR_IDLE_ALIVE_TIME_SECS = 20;
+ private final Executor mExecutor;
+
+ /**
+ * Creates an {@link ExecutorService} which has no persistent background thread, and ensures
+ * tasks will run in submit order.
+ */
+ private static ExecutorService createExecutorService() {
+ return new ThreadPoolExecutor(
+ /* corePoolSize= */ 0,
+ /* maximumPoolSize= */ 1,
+ EXECUTOR_IDLE_ALIVE_TIME_SECS,
+ TimeUnit.SECONDS,
+ new LinkedBlockingQueue<Runnable>() /* Not used */);
+ }
+
+ /**
+ * Sets executor used to construct the singleton.
+ *
+ * <p>If required, this method must be called before calling {@link #getInstance(Context)}.
+ *
+ * <p>If this method is not called, the reporter will run on a newly-created thread.
+ * This newly-created thread will be cleaned up and recreated as necessary when idle.
+ */
+ public static void initialize(@NonNull Context context, @NonNull Executor executor) {
+ if (context == null || executor == null) {
+ throw new NullPointerException();
+ }
+ synchronized (KeyedAppStatesReporter.class) {
+ if (sSingleton != null) {
+ throw new IllegalStateException(
+ "initialize can only be called once and must be called before "
+ + "calling getInstance.");
+ }
+ initializeSingleton(context, executor);
+ }
+ }
+
/**
* Returns an instance of the reporter.
*
@@ -115,14 +156,18 @@
if (sSingleton == null) {
synchronized (KeyedAppStatesReporter.class) {
if (sSingleton == null) {
- sSingleton = new KeyedAppStatesReporter(context);
- sSingleton.bind();
+ initializeSingleton(context, createExecutorService());
}
}
}
return sSingleton;
}
+ private static void initializeSingleton(@NonNull Context context, @NonNull Executor executor) {
+ sSingleton = new KeyedAppStatesReporter(context, executor);
+ sSingleton.bind();
+ }
+
@VisibleForTesting
static void resetSingleton() {
synchronized (KeyedAppStatesReporter.class) {
@@ -130,8 +175,9 @@
}
}
- private KeyedAppStatesReporter(Context context) {
+ private KeyedAppStatesReporter(Context context, Executor executor) {
this.mContext = context.getApplicationContext();
+ this.mExecutor = executor;
}
/**
@@ -161,16 +207,20 @@
set(states, false);
}
- private void set(Collection<KeyedAppState> states, boolean immediate) {
- if (states.isEmpty()) {
- Log.i(LOG_TAG, "states provided was empty");
- return;
- }
+ private void set(final Collection<KeyedAppState> states, final boolean immediate) {
+ mExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ if (states.isEmpty()) {
+ return;
+ }
- unbindOldBindings();
- bind();
+ unbindOldBindings();
+ bind();
- send(buildStatesBundle(states), immediate);
+ send(buildStatesBundle(states), immediate);
+ }
+ });
}
/**
@@ -185,7 +235,8 @@
set(states, true);
}
- private void bind() {
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ void bind() {
Collection<String> acceptablePackageNames = getDeviceOwnerAndProfileOwnerPackageNames();
acceptablePackageNames.add(PHONESKY_PACKAGE_NAME);
bind(acceptablePackageNames);
@@ -212,7 +263,8 @@
bindIntent.setComponent(new ComponentName(serviceInfo.packageName, serviceInfo.name));
BufferedServiceConnection bufferedServiceConnection =
- new BufferedServiceConnection(mContext, bindIntent, Context.BIND_AUTO_CREATE);
+ new BufferedServiceConnection(
+ mExecutor, mContext, bindIntent, Context.BIND_AUTO_CREATE);
bufferedServiceConnection.bindService();
mServiceConnections.put(serviceInfo.packageName, bufferedServiceConnection);
@@ -225,7 +277,7 @@
Collection<ComponentName> activeAdmins = devicePolicyManager.getActiveAdmins();
if (activeAdmins == null) {
- return Collections.emptyList();
+ return new ArrayList<>();
}
Collection<String> deviceOwnerProfileOwnerPackageNames = new ArrayList<>();
@@ -240,7 +292,8 @@
return deviceOwnerProfileOwnerPackageNames;
}
- private void unbindOldBindings() {
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ void unbindOldBindings() {
Iterator<Entry<String, BufferedServiceConnection>> iterator =
mServiceConnections.entrySet().iterator();
@@ -294,7 +347,8 @@
return validServiceInfo;
}
- private static Bundle buildStatesBundle(Collection<KeyedAppState> keyedAppStates) {
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ static Bundle buildStatesBundle(Collection<KeyedAppState> keyedAppStates) {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(APP_STATES, buildStateBundles(keyedAppStates));
return bundle;
@@ -309,7 +363,8 @@
return bundles;
}
- private void send(Bundle appStatesBundle, boolean immediate) {
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ void send(Bundle appStatesBundle, boolean immediate) {
for (BufferedServiceConnection serviceConnection : mServiceConnections.values()) {
// Messages cannot be reused so we create a copy for each service connection.
serviceConnection.send(createStateMessage(appStatesBundle, immediate));
diff --git a/enterprise/feedback/src/test/java/androidx/enterprise/feedback/BufferedServiceConnectionTest.java b/enterprise/feedback/src/test/java/androidx/enterprise/feedback/BufferedServiceConnectionTest.java
index 48b6b9c..4d8eff8 100644
--- a/enterprise/feedback/src/test/java/androidx/enterprise/feedback/BufferedServiceConnectionTest.java
+++ b/enterprise/feedback/src/test/java/androidx/enterprise/feedback/BufferedServiceConnectionTest.java
@@ -47,6 +47,9 @@
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowContextWrapper;
+import java.util.List;
+import java.util.concurrent.Executor;
+
/** Tests {@link BufferedServiceConnection}. */
@RunWith(RobolectricTestRunner.class)
@DoNotInstrument
@@ -61,9 +64,11 @@
private final Intent mBindIntent = new Intent();
private final int mFlags = 0;
+ private final Executor mExecutor = new TestExecutor();
+
private final TestHandler mTestHandler = new TestHandler();
private final BufferedServiceConnection mBufferedServiceConnection =
- new BufferedServiceConnection(mContext, mBindIntent, mFlags);
+ new BufferedServiceConnection(mExecutor, mContext, mBindIntent, mFlags);
private final ComponentName mTestComponentName = new ComponentName("test_package", "");
private final ComponentName mNotPhoneskyComponentName = mTestComponentName;
@@ -78,9 +83,18 @@
@Test
@SmallTest
+ public void construct_nullExecutor_throwsNullPointerException() {
+ try {
+ new BufferedServiceConnection(null, mContext, mBindIntent, mFlags);
+ fail();
+ } catch (NullPointerException expected) { }
+ }
+
+ @Test
+ @SmallTest
public void construct_nullContext_throwsNullPointerException() {
try {
- new BufferedServiceConnection(null, mBindIntent, mFlags);
+ new BufferedServiceConnection(mExecutor, null, mBindIntent, mFlags);
fail();
} catch (NullPointerException expected) { }
}
@@ -89,7 +103,7 @@
@SmallTest
public void construct_nullBindIntent_throwsNullPointerException() {
try {
- new BufferedServiceConnection(mContext, null, mFlags);
+ new BufferedServiceConnection(mExecutor, mContext, null, mFlags);
fail();
} catch (NullPointerException expected) { }
}
@@ -107,6 +121,14 @@
@Test
@SmallTest
+ public void bind_bindingExists() {
+ mBufferedServiceConnection.bindService();
+
+ assertThat(getBoundServiceConnections()).isNotEmpty();
+ }
+
+ @Test
+ @SmallTest
public void bind_alreadyBound_throwsIllegalStateException() {
mBufferedServiceConnection.bindService();
@@ -118,6 +140,25 @@
@Test
@SmallTest
+ public void unbind_bindingDoesNotExist() {
+ mBufferedServiceConnection.bindService();
+
+ mBufferedServiceConnection.unbind();
+
+ assertThat(getBoundServiceConnections()).isEmpty();
+ }
+
+ @Test
+ @SmallTest
+ public void unbind_hasntBound_throwsIllegalStateException() {
+ try {
+ mBufferedServiceConnection.unbind();
+ fail();
+ } catch (IllegalStateException expected) { }
+ }
+
+ @Test
+ @SmallTest
public void sendMessage_bound_sends() {
mBufferedServiceConnection.bindService();
@@ -328,6 +369,10 @@
}
private ServiceConnection getServiceConnection() {
- return shadowOf((Application) mContext).getBoundServiceConnections().get(0);
+ return getBoundServiceConnections().get(0);
+ }
+
+ private List<ServiceConnection> getBoundServiceConnections() {
+ return shadowOf((Application) mContext).getBoundServiceConnections();
}
}
diff --git a/enterprise/feedback/src/test/java/androidx/enterprise/feedback/KeyedAppStatesReporterTest.java b/enterprise/feedback/src/test/java/androidx/enterprise/feedback/KeyedAppStatesReporterTest.java
index 28dfd13..56a8441 100644
--- a/enterprise/feedback/src/test/java/androidx/enterprise/feedback/KeyedAppStatesReporterTest.java
+++ b/enterprise/feedback/src/test/java/androidx/enterprise/feedback/KeyedAppStatesReporterTest.java
@@ -63,6 +63,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.concurrent.Executor;
/** Tests {@link KeyedAppStatesReporter}. */
@RunWith(RobolectricTestRunner.class)
@@ -72,6 +73,8 @@
private final ComponentName mTestComponentName = new ComponentName("test_package", "");
+ private final Executor mExecutor = new TestExecutor();
+
private final ContextWrapper mContext = ApplicationProvider.getApplicationContext();
private final DevicePolicyManager mDevicePolicyManager =
(DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
@@ -92,10 +95,48 @@
@Test
@SmallTest
public void getInstance_nullContext_throwsNullPointerException() {
+ KeyedAppStatesReporter.resetSingleton();
try {
KeyedAppStatesReporter.getInstance(null);
fail();
- } catch (NullPointerException expected) { }
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void initialize_usesExecutor() {
+ KeyedAppStatesReporter.resetSingleton();
+ TestExecutor testExecutor = new TestExecutor();
+ KeyedAppStatesReporter.initialize(mContext, testExecutor);
+
+ KeyedAppStatesReporter.getInstance(mContext).set(singleton(mState));
+
+ assertThat(testExecutor.lastExecuted()).isNotNull();
+ }
+
+ @Test
+ @SmallTest
+ public void initialize_calledMultipleTimes_throwsIllegalStateException() {
+ KeyedAppStatesReporter.resetSingleton();
+ KeyedAppStatesReporter.initialize(mContext, mExecutor);
+
+ try {
+ KeyedAppStatesReporter.initialize(mContext, mExecutor);
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void initialize_calledAfterGetInstance_throwsIllegalStateException() {
+ KeyedAppStatesReporter.resetSingleton();
+ KeyedAppStatesReporter.getInstance(mContext);
+
+ try {
+ KeyedAppStatesReporter.initialize(mContext, mExecutor);
+ } catch (IllegalStateException expected) {
+ }
}
@Test
@@ -103,7 +144,7 @@
public void setIncludesAppStateBundle() {
setTestHandlerReceivesStates();
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
Bundle appStatesBundle = buildStatesBundle(singleton(mState));
@@ -150,7 +191,7 @@
public void setEmpty_doesNotSend() {
setTestHandlerReceivesStates();
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(Collections.<KeyedAppState>emptyList());
assertThat(mTestHandler.latestMessage()).isNull();
@@ -161,7 +202,7 @@
public void setNotImmediate() {
setTestHandlerReceivesStates();
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
assertThat(mTestHandler.latestMessage().what).isEqualTo(WHAT_STATE);
@@ -172,7 +213,7 @@
public void setImmediate() {
setTestHandlerReceivesStates();
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.setImmediate(singletonList(mState));
assertThat(mTestHandler.latestMessage().what).isEqualTo(WHAT_IMMEDIATE_STATE);
@@ -184,7 +225,7 @@
addComponentAsRespondingToAppStatesIntent(mTestComponentName);
setComponentBindingToHandler(mTestComponentName, mTestHandler);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
assertThat(mTestHandler.latestMessage()).isNull();
@@ -197,7 +238,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setDeviceOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
assertThat(mTestHandler.latestMessage()).isNotNull();
@@ -210,7 +251,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
assertThat(mTestHandler.latestMessage()).isNotNull();
@@ -223,7 +264,7 @@
addComponentAsRespondingToAppStatesIntent(phoneskyComponentName);
setComponentBindingToHandler(phoneskyComponentName, mTestHandler);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
assertThat(mTestHandler.latestMessage()).isNotNull();
@@ -243,7 +284,7 @@
setComponentBindingToHandler(phoneskyComponentName, phoneskyTestHandler);
// Act
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
// Assert
@@ -258,7 +299,7 @@
addComponentAsRespondingToAppStatesIntent(mTestComponentName);
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
mTestHandler.reset();
@@ -283,7 +324,7 @@
addComponentAsRespondingToAppStatesIntent(mTestComponentName);
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setDeviceOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
reporter.set(singletonList(mState));
mTestHandler.reset();
@@ -310,7 +351,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
// Set the binding to a different handler - as if the app has restarted.
TestHandler newAppTestHandler = new TestHandler();
@@ -335,7 +376,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
// Set the binding to a different handler - as if the app has restarted.
TestHandler newAppTestHandler = new TestHandler();
@@ -360,7 +401,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
simulateDisconnectingServiceConnection();
@@ -380,7 +421,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
simulateDisconnectingServiceConnection();
reporter.set(singletonList(mState));
@@ -400,7 +441,7 @@
setComponentBindingToHandler(mTestComponentName, mTestHandler);
shadowOf(mDevicePolicyManager).setProfileOwner(mTestComponentName);
- KeyedAppStatesReporter reporter = KeyedAppStatesReporter.getInstance(mContext);
+ KeyedAppStatesReporter reporter = getReporter(mContext);
// Change the component binding to ensure that it doesn't reconnect
setComponentBindingToHandler(mTestComponentName, new TestHandler());
@@ -457,4 +498,9 @@
private ServiceConnection getServiceConnection() {
return shadowOf((Application) mContext).getBoundServiceConnections().get(0);
}
+
+ private KeyedAppStatesReporter getReporter(Context context) {
+ KeyedAppStatesReporter.initialize(context, mExecutor);
+ return KeyedAppStatesReporter.getInstance(context);
+ }
}
diff --git a/enterprise/feedback/src/test/java/androidx/enterprise/feedback/TestExecutor.java b/enterprise/feedback/src/test/java/androidx/enterprise/feedback/TestExecutor.java
new file mode 100644
index 0000000..6623870
--- /dev/null
+++ b/enterprise/feedback/src/test/java/androidx/enterprise/feedback/TestExecutor.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.enterprise.feedback;
+
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+import java.util.concurrent.Executor;
+
+/**
+ * {@link Executor} which executes all {@link Runnable} instances inline and records that they have
+ * run.
+ */
+@DoNotInstrument
+public class TestExecutor implements Executor {
+
+ private Runnable mLastExecuted;
+
+ @Override
+ public void execute(Runnable command) {
+ command.run();
+ mLastExecuted = command;
+ }
+
+ public Runnable lastExecuted() {
+ return mLastExecuted;
+ }
+}
diff --git a/exifinterface/api/1.1.0-alpha01.txt b/exifinterface/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..75772d7
--- /dev/null
+++ b/exifinterface/api/1.1.0-alpha01.txt
@@ -0,0 +1,336 @@
+// Signature format: 3.0
+package androidx.exifinterface.media {
+
+ public class ExifInterface {
+ ctor public ExifInterface(java.io.File) throws java.io.IOException;
+ ctor public ExifInterface(String) throws java.io.IOException;
+ ctor public ExifInterface(java.io.FileDescriptor) throws java.io.IOException;
+ ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
+ method public void flipHorizontally();
+ method public void flipVertically();
+ method public double getAltitude(double);
+ method public String? getAttribute(String);
+ method public double getAttributeDouble(String, double);
+ method public int getAttributeInt(String, int);
+ method @Deprecated public boolean getLatLong(float[]!);
+ method public double[]? getLatLong();
+ method public int getRotationDegrees();
+ method public byte[]? getThumbnail();
+ method public android.graphics.Bitmap? getThumbnailBitmap();
+ method public byte[]? getThumbnailBytes();
+ method public long[]? getThumbnailRange();
+ method public boolean hasThumbnail();
+ method public boolean isFlipped();
+ method public boolean isThumbnailCompressed();
+ method public void resetOrientation();
+ method public void rotate(int);
+ method public void saveAttributes() throws java.io.IOException;
+ method public void setAltitude(double);
+ method public void setAttribute(String, String?);
+ method public void setGpsInfo(android.location.Location!);
+ method public void setLatLong(double, double);
+ field public static final short ALTITUDE_ABOVE_SEA_LEVEL = 0; // 0x0
+ field public static final short ALTITUDE_BELOW_SEA_LEVEL = 1; // 0x1
+ field public static final int[]! BITS_PER_SAMPLE_GREYSCALE_1;
+ field public static final int[]! BITS_PER_SAMPLE_GREYSCALE_2;
+ field public static final int[]! BITS_PER_SAMPLE_RGB;
+ field public static final int COLOR_SPACE_S_RGB = 1; // 0x1
+ field public static final int COLOR_SPACE_UNCALIBRATED = 65535; // 0xffff
+ field public static final short CONTRAST_HARD = 2; // 0x2
+ field public static final short CONTRAST_NORMAL = 0; // 0x0
+ field public static final short CONTRAST_SOFT = 1; // 0x1
+ field public static final int DATA_DEFLATE_ZIP = 8; // 0x8
+ field public static final int DATA_HUFFMAN_COMPRESSED = 2; // 0x2
+ field public static final int DATA_JPEG = 6; // 0x6
+ field public static final int DATA_JPEG_COMPRESSED = 7; // 0x7
+ field public static final int DATA_LOSSY_JPEG = 34892; // 0x884c
+ field public static final int DATA_PACK_BITS_COMPRESSED = 32773; // 0x8005
+ field public static final int DATA_UNCOMPRESSED = 1; // 0x1
+ field public static final short EXPOSURE_MODE_AUTO = 0; // 0x0
+ field public static final short EXPOSURE_MODE_AUTO_BRACKET = 2; // 0x2
+ field public static final short EXPOSURE_MODE_MANUAL = 1; // 0x1
+ field public static final short EXPOSURE_PROGRAM_ACTION = 6; // 0x6
+ field public static final short EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3; // 0x3
+ field public static final short EXPOSURE_PROGRAM_CREATIVE = 5; // 0x5
+ field public static final short EXPOSURE_PROGRAM_LANDSCAPE_MODE = 8; // 0x8
+ field public static final short EXPOSURE_PROGRAM_MANUAL = 1; // 0x1
+ field public static final short EXPOSURE_PROGRAM_NORMAL = 2; // 0x2
+ field public static final short EXPOSURE_PROGRAM_NOT_DEFINED = 0; // 0x0
+ field public static final short EXPOSURE_PROGRAM_PORTRAIT_MODE = 7; // 0x7
+ field public static final short EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4; // 0x4
+ field public static final short FILE_SOURCE_DSC = 3; // 0x3
+ field public static final short FILE_SOURCE_OTHER = 0; // 0x0
+ field public static final short FILE_SOURCE_REFLEX_SCANNER = 2; // 0x2
+ field public static final short FILE_SOURCE_TRANSPARENT_SCANNER = 1; // 0x1
+ field public static final short FLAG_FLASH_FIRED = 1; // 0x1
+ field public static final short FLAG_FLASH_MODE_AUTO = 24; // 0x18
+ field public static final short FLAG_FLASH_MODE_COMPULSORY_FIRING = 8; // 0x8
+ field public static final short FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION = 16; // 0x10
+ field public static final short FLAG_FLASH_NO_FLASH_FUNCTION = 32; // 0x20
+ field public static final short FLAG_FLASH_RED_EYE_SUPPORTED = 64; // 0x40
+ field public static final short FLAG_FLASH_RETURN_LIGHT_DETECTED = 6; // 0x6
+ field public static final short FLAG_FLASH_RETURN_LIGHT_NOT_DETECTED = 4; // 0x4
+ field public static final short FORMAT_CHUNKY = 1; // 0x1
+ field public static final short FORMAT_PLANAR = 2; // 0x2
+ field public static final short GAIN_CONTROL_HIGH_GAIN_DOWN = 4; // 0x4
+ field public static final short GAIN_CONTROL_HIGH_GAIN_UP = 2; // 0x2
+ field public static final short GAIN_CONTROL_LOW_GAIN_DOWN = 3; // 0x3
+ field public static final short GAIN_CONTROL_LOW_GAIN_UP = 1; // 0x1
+ field public static final short GAIN_CONTROL_NONE = 0; // 0x0
+ field public static final String GPS_DIRECTION_MAGNETIC = "M";
+ field public static final String GPS_DIRECTION_TRUE = "T";
+ field public static final String GPS_DISTANCE_KILOMETERS = "K";
+ field public static final String GPS_DISTANCE_MILES = "M";
+ field public static final String GPS_DISTANCE_NAUTICAL_MILES = "N";
+ field public static final String GPS_MEASUREMENT_2D = "2";
+ field public static final String GPS_MEASUREMENT_3D = "3";
+ field public static final short GPS_MEASUREMENT_DIFFERENTIAL_CORRECTED = 1; // 0x1
+ field public static final String GPS_MEASUREMENT_INTERRUPTED = "V";
+ field public static final String GPS_MEASUREMENT_IN_PROGRESS = "A";
+ field public static final short GPS_MEASUREMENT_NO_DIFFERENTIAL = 0; // 0x0
+ field public static final String GPS_SPEED_KILOMETERS_PER_HOUR = "K";
+ field public static final String GPS_SPEED_KNOTS = "N";
+ field public static final String GPS_SPEED_MILES_PER_HOUR = "M";
+ field public static final String LATITUDE_NORTH = "N";
+ field public static final String LATITUDE_SOUTH = "S";
+ field public static final short LIGHT_SOURCE_CLOUDY_WEATHER = 10; // 0xa
+ field public static final short LIGHT_SOURCE_COOL_WHITE_FLUORESCENT = 14; // 0xe
+ field public static final short LIGHT_SOURCE_D50 = 23; // 0x17
+ field public static final short LIGHT_SOURCE_D55 = 20; // 0x14
+ field public static final short LIGHT_SOURCE_D65 = 21; // 0x15
+ field public static final short LIGHT_SOURCE_D75 = 22; // 0x16
+ field public static final short LIGHT_SOURCE_DAYLIGHT = 1; // 0x1
+ field public static final short LIGHT_SOURCE_DAYLIGHT_FLUORESCENT = 12; // 0xc
+ field public static final short LIGHT_SOURCE_DAY_WHITE_FLUORESCENT = 13; // 0xd
+ field public static final short LIGHT_SOURCE_FINE_WEATHER = 9; // 0x9
+ field public static final short LIGHT_SOURCE_FLASH = 4; // 0x4
+ field public static final short LIGHT_SOURCE_FLUORESCENT = 2; // 0x2
+ field public static final short LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN = 24; // 0x18
+ field public static final short LIGHT_SOURCE_OTHER = 255; // 0xff
+ field public static final short LIGHT_SOURCE_SHADE = 11; // 0xb
+ field public static final short LIGHT_SOURCE_STANDARD_LIGHT_A = 17; // 0x11
+ field public static final short LIGHT_SOURCE_STANDARD_LIGHT_B = 18; // 0x12
+ field public static final short LIGHT_SOURCE_STANDARD_LIGHT_C = 19; // 0x13
+ field public static final short LIGHT_SOURCE_TUNGSTEN = 3; // 0x3
+ field public static final short LIGHT_SOURCE_UNKNOWN = 0; // 0x0
+ field public static final short LIGHT_SOURCE_WARM_WHITE_FLUORESCENT = 16; // 0x10
+ field public static final short LIGHT_SOURCE_WHITE_FLUORESCENT = 15; // 0xf
+ field public static final String LONGITUDE_EAST = "E";
+ field public static final String LONGITUDE_WEST = "W";
+ field public static final short METERING_MODE_AVERAGE = 1; // 0x1
+ field public static final short METERING_MODE_CENTER_WEIGHT_AVERAGE = 2; // 0x2
+ field public static final short METERING_MODE_MULTI_SPOT = 4; // 0x4
+ field public static final short METERING_MODE_OTHER = 255; // 0xff
+ field public static final short METERING_MODE_PARTIAL = 6; // 0x6
+ field public static final short METERING_MODE_PATTERN = 5; // 0x5
+ field public static final short METERING_MODE_SPOT = 3; // 0x3
+ field public static final short METERING_MODE_UNKNOWN = 0; // 0x0
+ field public static final int ORIENTATION_FLIP_HORIZONTAL = 2; // 0x2
+ field public static final int ORIENTATION_FLIP_VERTICAL = 4; // 0x4
+ field public static final int ORIENTATION_NORMAL = 1; // 0x1
+ field public static final int ORIENTATION_ROTATE_180 = 3; // 0x3
+ field public static final int ORIENTATION_ROTATE_270 = 8; // 0x8
+ field public static final int ORIENTATION_ROTATE_90 = 6; // 0x6
+ field public static final int ORIENTATION_TRANSPOSE = 5; // 0x5
+ field public static final int ORIENTATION_TRANSVERSE = 7; // 0x7
+ field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
+ field public static final int ORIGINAL_RESOLUTION_IMAGE = 0; // 0x0
+ field public static final int PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO = 1; // 0x1
+ field public static final int PHOTOMETRIC_INTERPRETATION_RGB = 2; // 0x2
+ field public static final int PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO = 0; // 0x0
+ field public static final int PHOTOMETRIC_INTERPRETATION_YCBCR = 6; // 0x6
+ field public static final int REDUCED_RESOLUTION_IMAGE = 1; // 0x1
+ field public static final short RENDERED_PROCESS_CUSTOM = 1; // 0x1
+ field public static final short RENDERED_PROCESS_NORMAL = 0; // 0x0
+ field public static final short RESOLUTION_UNIT_CENTIMETERS = 3; // 0x3
+ field public static final short RESOLUTION_UNIT_INCHES = 2; // 0x2
+ field public static final short SATURATION_HIGH = 0; // 0x0
+ field public static final short SATURATION_LOW = 0; // 0x0
+ field public static final short SATURATION_NORMAL = 0; // 0x0
+ field public static final short SCENE_CAPTURE_TYPE_LANDSCAPE = 1; // 0x1
+ field public static final short SCENE_CAPTURE_TYPE_NIGHT = 3; // 0x3
+ field public static final short SCENE_CAPTURE_TYPE_PORTRAIT = 2; // 0x2
+ field public static final short SCENE_CAPTURE_TYPE_STANDARD = 0; // 0x0
+ field public static final short SCENE_TYPE_DIRECTLY_PHOTOGRAPHED = 1; // 0x1
+ field public static final short SENSITIVITY_TYPE_ISO_SPEED = 3; // 0x3
+ field public static final short SENSITIVITY_TYPE_REI = 2; // 0x2
+ field public static final short SENSITIVITY_TYPE_REI_AND_ISO = 6; // 0x6
+ field public static final short SENSITIVITY_TYPE_SOS = 1; // 0x1
+ field public static final short SENSITIVITY_TYPE_SOS_AND_ISO = 5; // 0x5
+ field public static final short SENSITIVITY_TYPE_SOS_AND_REI = 4; // 0x4
+ field public static final short SENSITIVITY_TYPE_SOS_AND_REI_AND_ISO = 7; // 0x7
+ field public static final short SENSITIVITY_TYPE_UNKNOWN = 0; // 0x0
+ field public static final short SENSOR_TYPE_COLOR_SEQUENTIAL = 5; // 0x5
+ field public static final short SENSOR_TYPE_COLOR_SEQUENTIAL_LINEAR = 8; // 0x8
+ field public static final short SENSOR_TYPE_NOT_DEFINED = 1; // 0x1
+ field public static final short SENSOR_TYPE_ONE_CHIP = 2; // 0x2
+ field public static final short SENSOR_TYPE_THREE_CHIP = 4; // 0x4
+ field public static final short SENSOR_TYPE_TRILINEAR = 7; // 0x7
+ field public static final short SENSOR_TYPE_TWO_CHIP = 3; // 0x3
+ field public static final short SHARPNESS_HARD = 2; // 0x2
+ field public static final short SHARPNESS_NORMAL = 0; // 0x0
+ field public static final short SHARPNESS_SOFT = 1; // 0x1
+ field public static final short SUBJECT_DISTANCE_RANGE_CLOSE_VIEW = 2; // 0x2
+ field public static final short SUBJECT_DISTANCE_RANGE_DISTANT_VIEW = 3; // 0x3
+ field public static final short SUBJECT_DISTANCE_RANGE_MACRO = 1; // 0x1
+ field public static final short SUBJECT_DISTANCE_RANGE_UNKNOWN = 0; // 0x0
+ field public static final String TAG_APERTURE_VALUE = "ApertureValue";
+ field public static final String TAG_ARTIST = "Artist";
+ field public static final String TAG_BITS_PER_SAMPLE = "BitsPerSample";
+ field public static final String TAG_BODY_SERIAL_NUMBER = "BodySerialNumber";
+ field public static final String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
+ field @Deprecated public static final String TAG_CAMARA_OWNER_NAME = "CameraOwnerName";
+ field public static final String TAG_CAMERA_OWNER_NAME = "CameraOwnerName";
+ field public static final String TAG_CFA_PATTERN = "CFAPattern";
+ field public static final String TAG_COLOR_SPACE = "ColorSpace";
+ field public static final String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
+ field public static final String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
+ field public static final String TAG_COMPRESSION = "Compression";
+ field public static final String TAG_CONTRAST = "Contrast";
+ field public static final String TAG_COPYRIGHT = "Copyright";
+ field public static final String TAG_CUSTOM_RENDERED = "CustomRendered";
+ field public static final String TAG_DATETIME = "DateTime";
+ field public static final String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
+ field public static final String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
+ field public static final String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
+ field public static final String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
+ field public static final String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
+ field public static final String TAG_DNG_VERSION = "DNGVersion";
+ field public static final String TAG_EXIF_VERSION = "ExifVersion";
+ field public static final String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
+ field public static final String TAG_EXPOSURE_INDEX = "ExposureIndex";
+ field public static final String TAG_EXPOSURE_MODE = "ExposureMode";
+ field public static final String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
+ field public static final String TAG_EXPOSURE_TIME = "ExposureTime";
+ field public static final String TAG_FILE_SOURCE = "FileSource";
+ field public static final String TAG_FLASH = "Flash";
+ field public static final String TAG_FLASHPIX_VERSION = "FlashpixVersion";
+ field public static final String TAG_FLASH_ENERGY = "FlashEnergy";
+ field public static final String TAG_FOCAL_LENGTH = "FocalLength";
+ field public static final String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
+ field public static final String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
+ field public static final String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
+ field public static final String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
+ field public static final String TAG_F_NUMBER = "FNumber";
+ field public static final String TAG_GAIN_CONTROL = "GainControl";
+ field public static final String TAG_GAMMA = "Gamma";
+ field public static final String TAG_GPS_ALTITUDE = "GPSAltitude";
+ field public static final String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
+ field public static final String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
+ field public static final String TAG_GPS_DATESTAMP = "GPSDateStamp";
+ field public static final String TAG_GPS_DEST_BEARING = "GPSDestBearing";
+ field public static final String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
+ field public static final String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
+ field public static final String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
+ field public static final String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
+ field public static final String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
+ field public static final String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
+ field public static final String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
+ field public static final String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
+ field public static final String TAG_GPS_DOP = "GPSDOP";
+ field public static final String TAG_GPS_H_POSITIONING_ERROR = "GPSHPositioningError";
+ field public static final String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
+ field public static final String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
+ field public static final String TAG_GPS_LATITUDE = "GPSLatitude";
+ field public static final String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
+ field public static final String TAG_GPS_LONGITUDE = "GPSLongitude";
+ field public static final String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
+ field public static final String TAG_GPS_MAP_DATUM = "GPSMapDatum";
+ field public static final String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
+ field public static final String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
+ field public static final String TAG_GPS_SATELLITES = "GPSSatellites";
+ field public static final String TAG_GPS_SPEED = "GPSSpeed";
+ field public static final String TAG_GPS_SPEED_REF = "GPSSpeedRef";
+ field public static final String TAG_GPS_STATUS = "GPSStatus";
+ field public static final String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
+ field public static final String TAG_GPS_TRACK = "GPSTrack";
+ field public static final String TAG_GPS_TRACK_REF = "GPSTrackRef";
+ field public static final String TAG_GPS_VERSION_ID = "GPSVersionID";
+ field public static final String TAG_IMAGE_DESCRIPTION = "ImageDescription";
+ field public static final String TAG_IMAGE_LENGTH = "ImageLength";
+ field public static final String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
+ field public static final String TAG_IMAGE_WIDTH = "ImageWidth";
+ field public static final String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
+ field public static final String TAG_ISO_SPEED = "ISOSpeed";
+ field public static final String TAG_ISO_SPEED_LATITUDE_YYY = "ISOSpeedLatitudeyyy";
+ field public static final String TAG_ISO_SPEED_LATITUDE_ZZZ = "ISOSpeedLatitudezzz";
+ field @Deprecated public static final String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
+ field public static final String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
+ field public static final String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
+ field public static final String TAG_LENS_MAKE = "LensMake";
+ field public static final String TAG_LENS_MODEL = "LensModel";
+ field public static final String TAG_LENS_SERIAL_NUMBER = "LensSerialNumber";
+ field public static final String TAG_LENS_SPECIFICATION = "LensSpecification";
+ field public static final String TAG_LIGHT_SOURCE = "LightSource";
+ field public static final String TAG_MAKE = "Make";
+ field public static final String TAG_MAKER_NOTE = "MakerNote";
+ field public static final String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
+ field public static final String TAG_METERING_MODE = "MeteringMode";
+ field public static final String TAG_MODEL = "Model";
+ field public static final String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
+ field public static final String TAG_OECF = "OECF";
+ field public static final String TAG_ORF_ASPECT_FRAME = "AspectFrame";
+ field public static final String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
+ field public static final String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
+ field public static final String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
+ field public static final String TAG_ORIENTATION = "Orientation";
+ field public static final String TAG_PHOTOGRAPHIC_SENSITIVITY = "PhotographicSensitivity";
+ field public static final String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
+ field public static final String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
+ field public static final String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
+ field public static final String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
+ field public static final String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
+ field public static final String TAG_RECOMMENDED_EXPOSURE_INDEX = "RecommendedExposureIndex";
+ field public static final String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
+ field public static final String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
+ field public static final String TAG_RESOLUTION_UNIT = "ResolutionUnit";
+ field public static final String TAG_ROWS_PER_STRIP = "RowsPerStrip";
+ field public static final String TAG_RW2_ISO = "ISO";
+ field public static final String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
+ field public static final String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
+ field public static final String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
+ field public static final String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
+ field public static final String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
+ field public static final String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
+ field public static final String TAG_SATURATION = "Saturation";
+ field public static final String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
+ field public static final String TAG_SCENE_TYPE = "SceneType";
+ field public static final String TAG_SENSING_METHOD = "SensingMethod";
+ field public static final String TAG_SENSITIVITY_TYPE = "SensitivityType";
+ field public static final String TAG_SHARPNESS = "Sharpness";
+ field public static final String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
+ field public static final String TAG_SOFTWARE = "Software";
+ field public static final String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
+ field public static final String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
+ field public static final String TAG_STANDARD_OUTPUT_SENSITIVITY = "StandardOutputSensitivity";
+ field public static final String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
+ field public static final String TAG_STRIP_OFFSETS = "StripOffsets";
+ field public static final String TAG_SUBFILE_TYPE = "SubfileType";
+ field public static final String TAG_SUBJECT_AREA = "SubjectArea";
+ field public static final String TAG_SUBJECT_DISTANCE = "SubjectDistance";
+ field public static final String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
+ field public static final String TAG_SUBJECT_LOCATION = "SubjectLocation";
+ field public static final String TAG_SUBSEC_TIME = "SubSecTime";
+ field public static final String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
+ field public static final String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
+ field public static final String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
+ field public static final String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
+ field public static final String TAG_TRANSFER_FUNCTION = "TransferFunction";
+ field public static final String TAG_USER_COMMENT = "UserComment";
+ field public static final String TAG_WHITE_BALANCE = "WhiteBalance";
+ field public static final String TAG_WHITE_POINT = "WhitePoint";
+ field public static final String TAG_X_RESOLUTION = "XResolution";
+ field public static final String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
+ field public static final String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
+ field public static final String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
+ field public static final String TAG_Y_RESOLUTION = "YResolution";
+ field @Deprecated public static final int WHITEBALANCE_AUTO = 0; // 0x0
+ field @Deprecated public static final int WHITEBALANCE_MANUAL = 1; // 0x1
+ field public static final short WHITE_BALANCE_AUTO = 0; // 0x0
+ field public static final short WHITE_BALANCE_MANUAL = 1; // 0x1
+ field public static final short Y_CB_CR_POSITIONING_CENTERED = 1; // 0x1
+ field public static final short Y_CB_CR_POSITIONING_CO_SITED = 2; // 0x2
+ }
+
+}
+
diff --git a/exifinterface/api/current.txt b/exifinterface/api/current.txt
index a509b24..75772d7 100644
--- a/exifinterface/api/current.txt
+++ b/exifinterface/api/current.txt
@@ -2,7 +2,9 @@
package androidx.exifinterface.media {
public class ExifInterface {
+ ctor public ExifInterface(java.io.File) throws java.io.IOException;
ctor public ExifInterface(String) throws java.io.IOException;
+ ctor public ExifInterface(java.io.FileDescriptor) throws java.io.IOException;
ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
method public void flipHorizontally();
method public void flipVertically();
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/exifinterface/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to exifinterface/api/res-1.1.0-alpha01.txt
diff --git a/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java b/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java
index b2a01ef..906eebd 100644
--- a/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java
+++ b/exifinterface/src/androidTest/java/androidx/exifinterface/media/ExifInterfaceTest.java
@@ -26,7 +26,10 @@
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.location.Location;
+import android.os.Build;
import android.os.Environment;
+import android.system.Os;
+import android.system.OsConstants;
import android.util.Log;
import android.util.Pair;
@@ -44,6 +47,7 @@
import java.io.ByteArrayInputStream;
import java.io.Closeable;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -71,6 +75,7 @@
private static final String[] IMAGE_FILENAMES = new String[] {
EXIF_BYTE_ORDER_II_JPEG, EXIF_BYTE_ORDER_MM_JPEG, LG_G4_ISO_800_DNG};
+ private static final int USER_READ_WRITE = 0600;
private static final String TEST_TEMP_FILE_NAME = "testImage";
private static final double DELTA = 1e-8;
// We translate double to rational in a 1/10000 precision.
@@ -775,8 +780,14 @@
File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
String verboseTag = imageFile.getName();
+ // Creates via file.
+ ExifInterface exifInterface = new ExifInterface(imageFile);
+ assertNotNull(exifInterface);
+ compareWithExpectedValue(exifInterface, expectedValue, verboseTag);
+
+
// Creates via path.
- ExifInterface exifInterface = new ExifInterface(imageFile.getAbsolutePath());
+ exifInterface = new ExifInterface(imageFile.getAbsolutePath());
assertNotNull(exifInterface);
compareWithExpectedValue(exifInterface, expectedValue, verboseTag);
@@ -789,6 +800,21 @@
} finally {
closeQuietly(in);
}
+
+ // Creates via FileDescriptor.
+ if (Build.VERSION.SDK_INT >= 21) {
+ FileDescriptor fd = null;
+ try {
+ fd = Os.open(imageFile.getAbsolutePath(), OsConstants.O_RDONLY,
+ OsConstants.S_IRWXU);
+ exifInterface = new ExifInterface(fd);
+ compareWithExpectedValue(exifInterface, expectedValue, verboseTag);
+ } catch (Exception e) {
+ throw new IOException("Failed to open file descriptor", e);
+ } finally {
+ closeQuietly(fd);
+ }
+ }
}
private void testSaveAttributes_withFileName(String fileName, ExpectedValue expectedValue)
@@ -874,6 +900,17 @@
}
}
+ private void closeQuietly(FileDescriptor fd) {
+ if (fd != null) {
+ try {
+ Os.close(fd);
+ } 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];
diff --git a/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java b/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
index 4061f8d..7dadb5b 100644
--- a/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
+++ b/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
@@ -20,6 +20,9 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Location;
+import android.os.Build;
+import android.system.Os;
+import android.system.OsConstants;
import android.util.Log;
import android.util.Pair;
@@ -35,6 +38,7 @@
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@@ -3698,8 +3702,9 @@
sExifPointerTagMap.put(EXIF_POINTER_TAGS[5].number, IFD_TYPE_ORF_IMAGE_PROCESSING); // 8256
}
- private final String mFilename;
- private final AssetManager.AssetInputStream mAssetInputStream;
+ private String mFilename;
+ private FileDescriptor mSeekableFileDescriptor;
+ private AssetManager.AssetInputStream mAssetInputStream;
private int mMimeType;
@SuppressWarnings("unchecked")
private final HashMap<String, ExifAttribute>[] mAttributes = new HashMap[EXIF_TAGS.length];
@@ -3727,15 +3732,50 @@
/**
* Reads Exif tags from the specified image file.
*/
+ public ExifInterface(@NonNull File file) throws IOException {
+ if (file == null) {
+ throw new IllegalArgumentException("file cannot be null");
+ }
+ initForFilename(file.getAbsolutePath());
+ }
+
+ /**
+ * Reads Exif tags from the specified image file.
+ */
public ExifInterface(@NonNull String filename) throws IOException {
if (filename == null) {
throw new IllegalArgumentException("filename cannot be null");
}
- FileInputStream in = null;
+ initForFilename(filename);
+ }
+
+ /**
+ * Reads Exif tags from the specified image file descriptor. Attribute mutation is supported
+ * for writable and seekable file descriptors only. This constructor will not rewind the offset
+ * of the given file descriptor. Developers should close the file descriptor after use.
+ */
+ public ExifInterface(@NonNull FileDescriptor fileDescriptor) throws IOException {
+ if (fileDescriptor == null) {
+ throw new IllegalArgumentException("fileDescriptor cannot be null");
+ }
mAssetInputStream = null;
- mFilename = filename;
+ mFilename = null;
+ if (Build.VERSION.SDK_INT >= 21 && isSeekableFD(fileDescriptor)) {
+ mSeekableFileDescriptor = fileDescriptor;
+ // Keep the original file descriptor in order to save attributes when it's seekable.
+ // Otherwise, just close the given file descriptor after reading it because the save
+ // feature won't be working.
+ try {
+ fileDescriptor = Os.dup(fileDescriptor);
+ } catch (Exception e) {
+ throw new IOException("Failed to duplicate file descriptor", e);
+ }
+ } else {
+ mSeekableFileDescriptor = null;
+ }
+ FileInputStream in = null;
try {
- in = new FileInputStream(filename);
+ in = new FileInputStream(fileDescriptor);
loadAttributes(in);
} finally {
closeQuietly(in);
@@ -3755,8 +3795,14 @@
mFilename = null;
if (inputStream instanceof AssetManager.AssetInputStream) {
mAssetInputStream = (AssetManager.AssetInputStream) inputStream;
+ mSeekableFileDescriptor = null;
+ } else if (inputStream instanceof FileInputStream
+ && (isSeekableFD(((FileInputStream) inputStream).getFD()))) {
+ mAssetInputStream = null;
+ mSeekableFileDescriptor = ((FileInputStream) inputStream).getFD();
} else {
mAssetInputStream = null;
+ mSeekableFileDescriptor = null;
}
loadAttributes(inputStream);
}
@@ -4281,6 +4327,18 @@
}
}
+ private static boolean isSeekableFD(FileDescriptor fd) throws IOException {
+ if (Build.VERSION.SDK_INT >= 21) {
+ try {
+ Os.lseek(fd, 0, OsConstants.SEEK_CUR);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
// Prints out attributes for debugging.
private void printAttributes() {
for (int i = 0; i < mAttributes.length; ++i) {
@@ -4306,7 +4364,7 @@
if (!mIsSupportedFile || mMimeType != IMAGE_TYPE_JPEG) {
throw new IOException("ExifInterface only supports saving attributes on JPEG formats.");
}
- if (mFilename == null) {
+ if (mSeekableFileDescriptor == null && mFilename == null) {
throw new IOException(
"ExifInterface does not support saving attributes for the current input.");
}
@@ -4314,19 +4372,45 @@
// Keep the thumbnail in memory
mThumbnailBytes = getThumbnail();
- File tempFile = new File(mFilename + ".tmp");
- File originalFile = new File(mFilename);
- if (!originalFile.renameTo(tempFile)) {
- throw new IOException("Could not rename to " + tempFile.getAbsolutePath());
- }
-
FileInputStream in = null;
FileOutputStream out = null;
+ File tempFile = null;
+ try {
+ // Move the original file to temporary file.
+ if (mFilename != null) {
+ tempFile = new File(mFilename + ".tmp");
+ File originalFile = new File(mFilename);
+ if (!originalFile.renameTo(tempFile)) {
+ throw new IOException("Couldn't rename to " + tempFile.getAbsolutePath());
+ }
+ } else if (Build.VERSION.SDK_INT >= 21 && mSeekableFileDescriptor != null) {
+ tempFile = File.createTempFile("temp", "jpg");
+ Os.lseek(mSeekableFileDescriptor, 0, OsConstants.SEEK_SET);
+ in = new FileInputStream(mSeekableFileDescriptor);
+ out = new FileOutputStream(tempFile);
+ copy(in, out);
+ }
+ } catch (Exception e) {
+ throw new IOException("Failed to copy file");
+ } finally {
+ closeQuietly(in);
+ closeQuietly(out);
+ }
+
+ in = null;
+ out = null;
try {
// Save the new file.
in = new FileInputStream(tempFile);
- out = new FileOutputStream(mFilename);
+ if (mFilename != null) {
+ out = new FileOutputStream(mFilename);
+ } else if (Build.VERSION.SDK_INT >= 21 && mSeekableFileDescriptor != null) {
+ Os.lseek(mSeekableFileDescriptor, 0, OsConstants.SEEK_SET);
+ out = new FileOutputStream(mSeekableFileDescriptor);
+ }
saveJpegAttributes(in, out);
+ } catch (Exception e) {
+ throw new IOException("Failed to copy file");
} finally {
closeQuietly(in);
closeQuietly(out);
@@ -4348,7 +4432,7 @@
* Returns the JPEG compressed thumbnail inside the image file, or {@code null} if there is no
* JPEG compressed thumbnail.
* The returned data can be decoded using
- * {@link android.graphics.BitmapFactory#decodeByteArray(byte[],int,int)}
+ * {@link BitmapFactory#decodeByteArray(byte[],int,int)}
*/
@Nullable
public byte[] getThumbnail() {
@@ -4384,6 +4468,10 @@
}
} else if (mFilename != null) {
in = new FileInputStream(mFilename);
+ } else if (Build.VERSION.SDK_INT >= 21 && mSeekableFileDescriptor != null) {
+ FileDescriptor fileDescriptor = Os.dup(mSeekableFileDescriptor);
+ Os.lseek(fileDescriptor, 0, OsConstants.SEEK_SET);
+ in = new FileInputStream(fileDescriptor);
}
if (in == null) {
// Should not be reached this.
@@ -4398,7 +4486,7 @@
}
mThumbnailBytes = buffer;
return buffer;
- } catch (IOException e) {
+ } catch (Exception e) {
// Couldn't get a thumbnail image.
Log.d(TAG, "Encountered exception while getting thumbnail", e);
} finally {
@@ -4665,6 +4753,23 @@
}
}
+ private void initForFilename(String filename) throws IOException {
+ FileInputStream in = null;
+ mAssetInputStream = null;
+ mFilename = filename;
+ try {
+ in = new FileInputStream(filename);
+ if (isSeekableFD(in.getFD())) {
+ mSeekableFileDescriptor = in.getFD();
+ } else {
+ mSeekableFileDescriptor = null;
+ }
+ loadAttributes(in);
+ } finally {
+ closeQuietly(in);
+ }
+ }
+
private static double convertRationalLatLonToDouble(String rationalString, String ref) {
try {
String [] parts = rationalString.split(",", -1);
@@ -5644,7 +5749,8 @@
mHasThumbnail = true;
mThumbnailOffset = thumbnailOffset;
mThumbnailLength = thumbnailLength;
- if (mFilename == null && mAssetInputStream == null) {
+ if (mFilename == null && mAssetInputStream == null
+ && mSeekableFileDescriptor == null) {
// Save the thumbnail in memory if the input doesn't support reading again.
byte[] thumbnailBytes = new byte[thumbnailLength];
in.seek(thumbnailOffset);
diff --git a/fragment/api/1.1.0-alpha04.ignore b/fragment/api/1.1.0-alpha04.ignore
deleted file mode 100644
index 800719d..0000000
--- a/fragment/api/1.1.0-alpha04.ignore
+++ /dev/null
@@ -1,7 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.fragment.app.FragmentManager#getFragmentFactory():
- Added method androidx.fragment.app.FragmentManager.getFragmentFactory()
-AddedAbstractMethod: androidx.fragment.app.FragmentManager#setFragmentFactory(androidx.fragment.app.FragmentFactory):
- Added method androidx.fragment.app.FragmentManager.setFragmentFactory(androidx.fragment.app.FragmentFactory)
-
-
diff --git a/fragment/api/1.1.0-alpha05.txt b/fragment/api/1.1.0-alpha05.txt
index 0883047..e586a2f 100644
--- a/fragment/api/1.1.0-alpha05.txt
+++ b/fragment/api/1.1.0-alpha05.txt
@@ -25,7 +25,7 @@
field public static final int STYLE_NO_TITLE = 1; // 0x1
}
- public class Fragment implements androidx.savedstate.bundle.BundleSavedStateRegistryOwner android.content.ComponentCallbacks androidx.lifecycle.LifecycleOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
+ public class Fragment implements android.content.ComponentCallbacks androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
ctor public Fragment();
method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String[]?);
method public final boolean equals(Object?);
@@ -33,7 +33,6 @@
method public boolean getAllowEnterTransitionOverlap();
method public boolean getAllowReturnTransitionOverlap();
method public final android.os.Bundle? getArguments();
- method public final androidx.savedstate.SavedStateRegistry<android.os.Bundle> getBundleSavedStateRegistry();
method public final androidx.fragment.app.FragmentManager getChildFragmentManager();
method public android.content.Context? getContext();
method public Object? getEnterTransition();
@@ -49,6 +48,7 @@
method public final android.content.res.Resources getResources();
method public final boolean getRetainInstance();
method public Object? getReturnTransition();
+ method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public Object? getSharedElementEnterTransition();
method public Object? getSharedElementReturnTransition();
method public final String getString(@StringRes int);
diff --git a/fragment/api/current.txt b/fragment/api/current.txt
index 0883047..e586a2f 100644
--- a/fragment/api/current.txt
+++ b/fragment/api/current.txt
@@ -25,7 +25,7 @@
field public static final int STYLE_NO_TITLE = 1; // 0x1
}
- public class Fragment implements androidx.savedstate.bundle.BundleSavedStateRegistryOwner android.content.ComponentCallbacks androidx.lifecycle.LifecycleOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
+ public class Fragment implements android.content.ComponentCallbacks androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
ctor public Fragment();
method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String[]?);
method public final boolean equals(Object?);
@@ -33,7 +33,6 @@
method public boolean getAllowEnterTransitionOverlap();
method public boolean getAllowReturnTransitionOverlap();
method public final android.os.Bundle? getArguments();
- method public final androidx.savedstate.SavedStateRegistry<android.os.Bundle> getBundleSavedStateRegistry();
method public final androidx.fragment.app.FragmentManager getChildFragmentManager();
method public android.content.Context? getContext();
method public Object? getEnterTransition();
@@ -49,6 +48,7 @@
method public final android.content.res.Resources getResources();
method public final boolean getRetainInstance();
method public Object? getReturnTransition();
+ method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public Object? getSharedElementEnterTransition();
method public Object? getSharedElementReturnTransition();
method public final String getString(@StringRes int);
diff --git a/fragment/build.gradle b/fragment/build.gradle
index aebf147..2b6c14a 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -20,7 +20,7 @@
}
api(project(":collection"))
api("androidx.viewpager:viewpager:1.0.0")
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":annotation"))
api("androidx.loader:loader:1.0.0")
api(project(":activity"))
api(ARCH_LIFECYCLE_VIEWMODEL, libs.exclude_annotations_transitive)
diff --git a/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.java b/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.java
deleted file mode 100644
index 4ea5c6b..0000000
--- a/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * 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.fragment.app;
-
-import static com.google.common.truth.Truth.assertWithMessage;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.test.EmptyFragmentTestActivity;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class DialogFragmentTest {
- @Rule
- public final ActivityTestRule<EmptyFragmentTestActivity> mActivityTestRule =
- new ActivityTestRule<>(EmptyFragmentTestActivity.class);
-
- @Test
- public void testDialogFragmentShows() {
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- TestDialogFragment fragment = new TestDialogFragment();
- fragment.show(mActivityTestRule.getActivity().getSupportFragmentManager(), null);
-
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- assertNotNull("Dialog was null", fragment.getDialog());
- assertTrue("Dialog was not being shown", fragment.getDialog().isShowing());
- }
-
- @Test
- public void testDialogFragmentShowsNow() throws Throwable {
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- final TestDialogFragment fragment = new TestDialogFragment();
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- fragment.showNow(mActivityTestRule.getActivity().getSupportFragmentManager(),
- null);
- }
- });
-
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- assertNotNull("Dialog was null", fragment.getDialog());
- assertTrue("Dialog was not being shown", fragment.getDialog().isShowing());
-
- final boolean[] dialogIsNonNull = new boolean[1];
- final boolean[] isShowing = new boolean[1];
- final int[] onDismissCalledCount = new int[1];
- final CountDownLatch countDownLatch = new CountDownLatch(2);
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- fragment.getLifecycle().addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
- public void onStop() {
- Dialog dialog = fragment.getDialog();
- dialogIsNonNull[0] = dialog != null;
- isShowing[0] = dialog != null && dialog.isShowing();
- countDownLatch.countDown();
- }
-
- @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
- public void onDestroy() {
- onDismissCalledCount[0] = fragment.onDismissCalledCount;
- countDownLatch.countDown();
- }
- });
- }
- });
-
- mActivityTestRule.finishActivity();
-
- countDownLatch.await(1, TimeUnit.SECONDS);
- assertWithMessage("onDismiss() should be called before onDestroy()")
- .that(onDismissCalledCount[0])
- .isEqualTo(1);
- assertTrue("Dialog should not be null in onStop()", dialogIsNonNull[0]);
- assertTrue("Dialog should still be showing in onStop() "
- + "during the normal lifecycle", isShowing[0]);
- }
-
- @Test
- public void testDialogFragmentDismiss() throws Throwable {
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- final TestDialogFragment fragment = new TestDialogFragment();
- fragment.show(mActivityTestRule.getActivity().getSupportFragmentManager(), null);
-
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- assertNotNull("Dialog was null", fragment.getDialog());
- assertTrue("Dialog was not being shown", fragment.getDialog().isShowing());
-
- final boolean[] dialogIsNonNull = new boolean[1];
- final boolean[] isShowing = new boolean[1];
- final CountDownLatch countDownLatch = new CountDownLatch(1);
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- fragment.getLifecycle().addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
- public void onStop() {
- Dialog dialog = fragment.getDialog();
- dialogIsNonNull[0] = dialog != null;
- isShowing[0] = dialog != null && dialog.isShowing();
- countDownLatch.countDown();
- }
- });
- }
- });
-
- final CountDownLatch dismissLatch = new CountDownLatch(1);
- fragment.setDestroyViewCallback(new TestDialogFragment.OnDestroyViewCallback() {
- @Override
- public void onDestroyView(TestDialogFragment fragment) {
- dismissLatch.countDown();
- }
- });
-
- fragment.dismiss();
-
- countDownLatch.await(1, TimeUnit.SECONDS);
-
- assertTrue("Dialog should not be null in onStop()", dialogIsNonNull[0]);
- assertFalse("Dialog should not be showing in onStop() "
- + "when manually dismissed", isShowing[0]);
-
- // Wait for the DialogFragment's onDestroyView to be called which is where the Dialog
- // gets null'ed out
- dismissLatch.await();
-
- assertNull("Dialog should be null after dismiss()", fragment.getDialog());
- }
-
- @Test
- public void testDialogFragmentDismissBeforeOnDestroy() throws Throwable {
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- final TestDialogFragment fragment = new TestDialogFragment();
- fragment.show(mActivityTestRule.getActivity().getSupportFragmentManager(), null);
-
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- final int[] onDismissCalledCount = new int[1];
- final CountDownLatch countDownLatch = new CountDownLatch(1);
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- fragment.getLifecycle().addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
- public void onDestroy() {
- onDismissCalledCount[0] = fragment.onDismissCalledCount;
- countDownLatch.countDown();
- }
- });
- }
- });
-
- InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- fragment.dismiss();
- }
- });
-
- countDownLatch.await(1, TimeUnit.SECONDS);
-
- assertWithMessage("onDismiss() should be called only once before onDestroy()")
- .that(onDismissCalledCount[0])
- .isEqualTo(1);
- }
-
- public static class TestDialogFragment extends DialogFragment {
-
- public interface OnDestroyViewCallback {
- void onDestroyView(TestDialogFragment fragment);
- }
-
- public int onDismissCalledCount = 0;
-
- private @Nullable OnDestroyViewCallback mDestroyViewCallback = null;
-
- public void setDestroyViewCallback(OnDestroyViewCallback callback) {
- mDestroyViewCallback = callback;
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- return new AlertDialog.Builder(getContext())
- .setTitle("Test")
- .setMessage("Message")
- .setPositiveButton("Button", null)
- .create();
- }
-
- @Override
- public void onDismiss(@NonNull DialogInterface dialog) {
- super.onDismiss(dialog);
- onDismissCalledCount++;
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- if (mDestroyViewCallback != null) {
- mDestroyViewCallback.onDestroyView(this);
- }
- }
- }
-}
-
diff --git a/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt b/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
new file mode 100644
index 0000000..8b7b33d
--- /dev/null
+++ b/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
@@ -0,0 +1,232 @@
+/*
+ * 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.fragment.app
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.content.DialogInterface
+import android.os.Bundle
+import android.os.Looper
+import androidx.fragment.app.test.EmptyFragmentTestActivity
+import androidx.lifecycle.GenericLifecycleObserver
+import androidx.lifecycle.Lifecycle
+import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class DialogFragmentTest {
+ @get:Rule
+ val activityTestRule = ActivityTestRule(EmptyFragmentTestActivity::class.java)
+
+ @Test
+ fun testDialogFragmentShows() {
+ val fragment = TestDialogFragment()
+ fragment.show(activityTestRule.activity.supportFragmentManager, null)
+ activityTestRule.runOnUiThread {
+ activityTestRule.activity.supportFragmentManager.executePendingTransactions()
+ }
+
+ assertWithMessage("Dialog was not being shown")
+ .that(fragment.dialog?.isShowing)
+ .isTrue()
+ }
+
+ @UiThreadTest
+ @Test
+ fun testDialogFragmentShowsNow() {
+ val fragment = TestDialogFragment()
+ fragment.showNow(activityTestRule.activity.supportFragmentManager, null)
+
+ assertWithMessage("Dialog was not being shown")
+ .that(fragment.dialog?.isShowing)
+ .isTrue()
+ }
+
+ @Test
+ fun testDialogFragmentDismissOnFinish() {
+ val fragment = TestDialogFragment()
+ activityTestRule.runOnUiThread {
+ fragment.showNow(activityTestRule.activity.supportFragmentManager, null)
+ }
+
+ assertWithMessage("Dialog was not being shown")
+ .that(fragment.dialog?.isShowing)
+ .isTrue()
+
+ var dialogIsNonNull = false
+ var isShowing = false
+ var onDismissCalledCount = 0
+ val countDownLatch = CountDownLatch(3)
+ activityTestRule.runOnUiThread {
+ fragment.lifecycle.addObserver(GenericLifecycleObserver { _, event ->
+ if (event == Lifecycle.Event.ON_STOP) {
+ val dialog = fragment.dialog
+ dialogIsNonNull = dialog != null
+ isShowing = dialog != null && dialog.isShowing
+ countDownLatch.countDown()
+ } else if (event == Lifecycle.Event.ON_DESTROY) {
+ onDismissCalledCount = fragment.onDismissCalledCount
+ countDownLatch.countDown()
+ }
+ })
+ }
+ var dismissOnMainThread = false
+ var dismissCalled = false
+ fragment.dismissCallback = {
+ dismissCalled = true
+ dismissOnMainThread = Looper.myLooper() == Looper.getMainLooper()
+ countDownLatch.countDown()
+ }
+
+ activityTestRule.finishActivity()
+
+ countDownLatch.await(1, TimeUnit.SECONDS)
+
+ assertWithMessage("Dialog should be dismissed")
+ .that(dismissCalled)
+ .isTrue()
+ assertWithMessage("Dismiss should always be called on the main thread")
+ .that(dismissOnMainThread)
+ .isTrue()
+ assertWithMessage("onDismiss() should be called before onDestroy()")
+ .that(onDismissCalledCount)
+ .isEqualTo(1)
+ assertWithMessage("Dialog should not be null in onStop()")
+ .that(dialogIsNonNull)
+ .isTrue()
+ assertWithMessage("Dialog should still be showing in onStop() during the normal lifecycle")
+ .that(isShowing)
+ .isTrue()
+ }
+
+ @Test
+ fun testDialogFragmentDismiss() {
+ val fragment = TestDialogFragment()
+ activityTestRule.runOnUiThread {
+ fragment.showNow(activityTestRule.activity.supportFragmentManager, null)
+ }
+
+ assertWithMessage("Dialog was not being shown")
+ .that(fragment.dialog?.isShowing)
+ .isTrue()
+
+ var dialogIsNonNull = false
+ var isShowing = false
+ var onDismissCalledCount = 0
+ val countDownLatch = CountDownLatch(3)
+ activityTestRule.runOnUiThread {
+ fragment.lifecycle.addObserver(GenericLifecycleObserver { _, event ->
+ if (event == Lifecycle.Event.ON_STOP) {
+ val dialog = fragment.dialog
+ dialogIsNonNull = dialog != null
+ isShowing = dialog != null && dialog.isShowing
+ countDownLatch.countDown()
+ } else if (event == Lifecycle.Event.ON_DESTROY) {
+ onDismissCalledCount = fragment.onDismissCalledCount
+ countDownLatch.countDown()
+ }
+ })
+ }
+ var dismissOnMainThread = false
+ var dismissCalled = false
+ fragment.dismissCallback = {
+ dismissCalled = true
+ dismissOnMainThread = Looper.myLooper() == Looper.getMainLooper()
+ countDownLatch.countDown()
+ }
+
+ fragment.dismiss()
+
+ countDownLatch.await(1, TimeUnit.SECONDS)
+
+ assertWithMessage("Dialog should be dismissed")
+ .that(dismissCalled)
+ .isTrue()
+ assertWithMessage("Dismiss should always be called on the main thread")
+ .that(dismissOnMainThread)
+ .isTrue()
+ assertWithMessage("onDismiss() should be called before onDestroy()")
+ .that(onDismissCalledCount)
+ .isEqualTo(1)
+ assertWithMessage("Dialog should not be null in onStop()")
+ .that(dialogIsNonNull)
+ .isTrue()
+ assertWithMessage("Dialog should not be showing in onStop() when manually dismissed")
+ .that(isShowing)
+ .isFalse()
+
+ assertWithMessage("Dialog should be null after dismiss()")
+ .that(fragment.dialog)
+ .isNull()
+ }
+
+ @Test
+ fun testDialogFragmentDismissBeforeOnDestroy() {
+ val fragment = TestDialogFragment()
+ activityTestRule.runOnUiThread {
+ fragment.showNow(activityTestRule.activity.supportFragmentManager, null)
+ }
+
+ var onDismissCalledCount = 0
+ val countDownLatch = CountDownLatch(1)
+ activityTestRule.runOnUiThread {
+ fragment.lifecycle.addObserver(GenericLifecycleObserver { _, event ->
+ if (event == Lifecycle.Event.ON_DESTROY) {
+ onDismissCalledCount = fragment.onDismissCalledCount
+ countDownLatch.countDown()
+ }
+ })
+ // Now dismiss the Fragment
+ fragment.dismiss()
+ }
+
+ countDownLatch.await(1, TimeUnit.SECONDS)
+
+ assertWithMessage("onDismiss() should be called only once before onDestroy()")
+ .that(onDismissCalledCount)
+ .isEqualTo(1)
+ }
+
+ class TestDialogFragment : DialogFragment() {
+
+ var onDismissCalledCount = 0
+ var dismissCallback: () -> Unit = {}
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ return AlertDialog.Builder(context)
+ .setTitle("Test")
+ .setMessage("Message")
+ .setPositiveButton("Button", null)
+ .create()
+ }
+
+ override fun onDismiss(dialog: DialogInterface) {
+ super.onDismiss(dialog)
+ onDismissCalledCount++
+ dismissCallback.invoke()
+ }
+ }
+}
diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java b/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java
index 48c2f2b..e6097d3 100644
--- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java
+++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.java
@@ -476,13 +476,13 @@
waitForAnimationReady();
final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
- final EndAnimationListenerFragment fragment1 = new EndAnimationListenerFragment();
+ final AnimationListenerFragment fragment1 = new AnimationListenerFragment();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment1)
.commit();
FragmentTestUtil.waitForExecution(mActivityRule);
- final EndAnimationListenerFragment fragment2 = new EndAnimationListenerFragment();
+ final AnimationListenerFragment fragment2 = new AnimationListenerFragment();
fm.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
@@ -519,6 +519,88 @@
});
}
+ @Test
+ public void animationListenersAreCalled() throws Throwable {
+ waitForAnimationReady();
+ final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+
+ // Add first fragment
+ final AnimationListenerFragment fragment1 = new AnimationListenerFragment();
+ fragment1.mForceRunOnHwLayer = false;
+ fragment1.mRepeat = true;
+ fm.beginTransaction()
+ .add(R.id.fragmentContainer, fragment1)
+ .commit();
+ FragmentTestUtil.waitForExecution(mActivityRule);
+
+ // Replace first fragment with second fragment with a fade in/out animation
+ final AnimationListenerFragment fragment2 = new AnimationListenerFragment();
+ fragment2.mForceRunOnHwLayer = true;
+ fragment2.mRepeat = false;
+ fm.beginTransaction()
+ .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
+ android.R.anim.fade_in, android.R.anim.fade_out)
+ .replace(R.id.fragmentContainer, fragment2)
+ .addToBackStack(null)
+ .commit();
+ FragmentTestUtil.waitForExecution(mActivityRule);
+
+ // Wait for animation to finish
+ assertTrue(fragment1.exitLatch.await(2, TimeUnit.SECONDS));
+ assertTrue(fragment2.enterLatch.await(2, TimeUnit.SECONDS));
+
+ // Check if all animation listener callbacks have been called
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ assertEquals(1, fragment1.mExitStartCount);
+ assertEquals(1, fragment1.mExitRepeatCount);
+ assertEquals(1, fragment1.mExitEndCount);
+ assertEquals(1, fragment2.mEnterStartCount);
+ assertEquals(0, fragment2.mEnterRepeatCount);
+ assertEquals(1, fragment2.mEnterEndCount);
+
+ // fragment1 exited, so its enter animation should not have been called
+ assertEquals(0, fragment1.mEnterStartCount);
+ assertEquals(0, fragment1.mEnterRepeatCount);
+ assertEquals(0, fragment1.mEnterEndCount);
+ // fragment2 entered, so its exit animation should not have been called
+ assertEquals(0, fragment2.mExitStartCount);
+ assertEquals(0, fragment2.mExitRepeatCount);
+ assertEquals(0, fragment2.mExitEndCount);
+ }
+ });
+ fragment1.resetCounts();
+ fragment2.resetCounts();
+
+ // Now pop the transaction
+ FragmentTestUtil.popBackStackImmediate(mActivityRule);
+
+ assertTrue(fragment2.exitLatch.await(2, TimeUnit.SECONDS));
+ assertTrue(fragment1.enterLatch.await(2, TimeUnit.SECONDS));
+
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ assertEquals(1, fragment2.mExitStartCount);
+ assertEquals(0, fragment2.mExitRepeatCount);
+ assertEquals(1, fragment2.mExitEndCount);
+ assertEquals(1, fragment1.mEnterStartCount);
+ assertEquals(1, fragment1.mEnterRepeatCount);
+ assertEquals(1, fragment1.mEnterEndCount);
+
+ // fragment1 entered, so its exit animation should not have been called
+ assertEquals(0, fragment1.mExitStartCount);
+ assertEquals(0, fragment1.mExitRepeatCount);
+ assertEquals(0, fragment1.mExitEndCount);
+ // fragment2 exited, so its enter animation should not have been called
+ assertEquals(0, fragment2.mEnterStartCount);
+ assertEquals(0, fragment2.mEnterRepeatCount);
+ assertEquals(0, fragment2.mEnterEndCount);
+ }
+ });
+ }
+
private void assertEnterPopExit(AnimatorFragment fragment) throws Throwable {
assertFragmentAnimation(fragment, 1, true, ENTER);
@@ -622,11 +704,24 @@
}
}
- public static class EndAnimationListenerFragment extends StrictViewFragment {
+ public static class AnimationListenerFragment extends StrictViewFragment {
public View view;
+ public boolean mForceRunOnHwLayer;
+ public boolean mRepeat;
+ public int mEnterStartCount = 0;
+ public int mEnterRepeatCount = 0;
+ public int mEnterEndCount = 0;
+ public int mExitStartCount = 0;
+ public int mExitRepeatCount = 0;
+ public int mExitEndCount = 0;
public final CountDownLatch enterLatch = new CountDownLatch(1);
public final CountDownLatch exitLatch = new CountDownLatch(1);
+ public void resetCounts() {
+ mEnterStartCount = mEnterRepeatCount = mEnterEndCount = 0;
+ mExitStartCount = mExitRepeatCount = mExitEndCount = 0;
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -634,6 +729,12 @@
return view;
}
view = super.onCreateView(inflater, container, savedInstanceState);
+ if (mForceRunOnHwLayer && view != null) {
+ // Set any background color on the TextView, so view.hasOverlappingRendering() will
+ // return true, which in turn makes FragmentManagerImpl.shouldRunOnHWLayer() return
+ // true.
+ view.setBackgroundColor(0xFFFFFFFF);
+ }
return view;
}
@@ -644,23 +745,44 @@
}
Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);
if (anim != null) {
+ if (mRepeat) {
+ anim.setRepeatCount(1);
+ }
anim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
+ if (enter) {
+ mEnterStartCount++;
+ } else {
+ mExitStartCount++;
+ }
}
@Override
public void onAnimationEnd(Animation animation) {
if (enter) {
+ mEnterEndCount++;
enterLatch.countDown();
} else {
- exitLatch.countDown();
+ mExitEndCount++;
+ // When exiting, the view is detached after onAnimationEnd,
+ // so wait one frame to count down the latch
+ view.post(new Runnable() {
+ @Override
+ public void run() {
+ exitLatch.countDown();
+ }
+ });
}
}
@Override
public void onAnimationRepeat(Animation animation) {
-
+ if (enter) {
+ mEnterRepeatCount++;
+ } else {
+ mExitRepeatCount++;
+ }
}
});
}
diff --git a/fragment/src/androidTest/java/androidx/fragment/app/FragmentSavedStateRegistryTest.kt b/fragment/src/androidTest/java/androidx/fragment/app/FragmentSavedStateRegistryTest.kt
index dce0c8e..cc85e34 100644
--- a/fragment/src/androidTest/java/androidx/fragment/app/FragmentSavedStateRegistryTest.kt
+++ b/fragment/src/androidTest/java/androidx/fragment/app/FragmentSavedStateRegistryTest.kt
@@ -45,7 +45,7 @@
fragmentManager.beginTransaction().add(testFragment, FRAGMENT_TAG).commitNow()
assertThat(fragmentManager.findFragmentByTag(FRAGMENT_TAG)).isNotNull()
assertThat(testFragment.lifecycle.currentState.isAtLeast(CREATED)).isTrue()
- val registry = testFragment.bundleSavedStateRegistry
+ val registry = testFragment.savedStateRegistry
val savedState = registry.consumeRestoredStateForKey(CALLBACK_KEY)
assertThat(savedState).isNull()
registry.registerSavedStateProvider(CALLBACK_KEY, DefaultProvider())
@@ -58,7 +58,7 @@
val recreated = recreateActivity(activityRule, activityRule.activity)
activityRule.runOnUiThread {
assertThat(recreated.fragment().lifecycle.currentState.isAtLeast(CREATED)).isTrue()
- checkDefaultSavedState(recreated.fragment().bundleSavedStateRegistry)
+ checkDefaultSavedState(recreated.fragment().savedStateRegistry)
}
}
@@ -70,7 +70,7 @@
recreated.fragment().lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
- checkDefaultSavedState(recreated.fragment().bundleSavedStateRegistry)
+ checkDefaultSavedState(recreated.fragment().savedStateRegistry)
}
})
}
@@ -83,7 +83,7 @@
}
}
-private fun checkDefaultSavedState(store: SavedStateRegistry<Bundle>) {
+private fun checkDefaultSavedState(store: SavedStateRegistry) {
val savedState = store.consumeRestoredStateForKey(CALLBACK_KEY)
assertThat(savedState).isNotNull()
assertThat(savedState!!.getString(KEY)).isEqualTo(VALUE)
@@ -98,12 +98,12 @@
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState != null) {
- checkDefaultSavedState(bundleSavedStateRegistry)
+ checkDefaultSavedState(savedStateRegistry)
}
}
}
-private class DefaultProvider : SavedStateRegistry.SavedStateProvider<Bundle> {
+private class DefaultProvider : SavedStateRegistry.SavedStateProvider {
override fun saveState() = Bundle().apply { putString(KEY, VALUE) }
}
diff --git a/fragment/src/androidTest/java/androidx/fragment/app/TransitionFragment.java b/fragment/src/androidTest/java/androidx/fragment/app/TransitionFragment.java
index 33a2ad9..ad8b45b1 100644
--- a/fragment/src/androidTest/java/androidx/fragment/app/TransitionFragment.java
+++ b/fragment/src/androidTest/java/androidx/fragment/app/TransitionFragment.java
@@ -69,7 +69,7 @@
}
void waitForTransition() throws InterruptedException {
- verify(mListener, CtsMockitoUtils.within(300)).onTransitionEnd((Transition) any());
+ verify(mListener, CtsMockitoUtils.within(1000)).onTransitionEnd((Transition) any());
reset(mListener);
}
diff --git a/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java b/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
index f305570..f4eb53c 100644
--- a/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
+++ b/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
@@ -16,7 +16,6 @@
package androidx.fragment.app;
-import android.annotation.SuppressLint;
import android.util.Log;
import android.view.View;
@@ -550,7 +549,6 @@
return setReorderingAllowed(allowOptimization);
}
- @SuppressLint("RestrictedApi")
int commitInternal(boolean allowStateLoss) {
if (mCommitted) throw new IllegalStateException("commit already called");
if (FragmentManagerImpl.DEBUG) {
diff --git a/fragment/src/main/java/androidx/fragment/app/DialogFragment.java b/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
index 51df134..5cc8a89 100644
--- a/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
+++ b/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
@@ -16,13 +16,15 @@
package androidx.fragment.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -49,7 +51,7 @@
implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({STYLE_NORMAL, STYLE_NO_TITLE, STYLE_NO_FRAME, STYLE_NO_INPUT})
@Retention(RetentionPolicy.SOURCE)
private @interface DialogStyle {}
@@ -87,6 +89,15 @@
private static final String SAVED_SHOWS_DIALOG = "android:showsDialog";
private static final String SAVED_BACK_STACK_ID = "android:backStackId";
+ private Handler mHandler;
+ private Runnable mDismissRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mDialog != null) {
+ onDismiss(mDialog);
+ }
+ }
+ };
int mStyle = STYLE_NORMAL;
int mTheme = 0;
boolean mCancelable = true;
@@ -208,7 +219,20 @@
mDismissed = true;
mShownByMe = false;
if (mDialog != null) {
+ // Instead of waiting for a posted onDismiss(), null out
+ // the listener and call onDismiss() manually to ensure
+ // that the callback happens before onDestroy()
+ mDialog.setOnDismissListener(null);
mDialog.dismiss();
+ // onDismiss() is always called on the main thread, so
+ // we mimic that behavior here. The difference here is that
+ // we don't post the message to ensure that the onDismiss()
+ // callback still happens before onDestroy()
+ if (Looper.myLooper() == mHandler.getLooper()) {
+ onDismiss(mDialog);
+ } else {
+ mHandler.post(mDismissRunnable);
+ }
}
mViewDestroyed = true;
if (mBackStackId >= 0) {
@@ -330,6 +354,8 @@
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ // This assumes that onCreate() is being called on the main thread
+ mHandler = new Handler();
mShowsDialog = mContainerId == 0;
@@ -362,7 +388,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setupDialog(@NonNull Dialog dialog, int style) {
switch (style) {
case STYLE_NO_INPUT:
@@ -504,12 +530,14 @@
// the dialog -- we don't want this to cause the fragment to
// actually be removed.
mViewDestroyed = true;
- if (mDialog.isShowing()) {
- // Instead of waiting for a posted onDismiss(), null out
- // the listener and call onDismiss() manually to ensure
- // that the callback happens before onDestroy()
- mDialog.setOnDismissListener(null);
- mDialog.dismiss();
+ // Instead of waiting for a posted onDismiss(), null out
+ // the listener and call onDismiss() manually to ensure
+ // that the callback happens before onDestroy()
+ mDialog.setOnDismissListener(null);
+ mDialog.dismiss();
+ if (!mDismissed) {
+ // Don't send a second onDismiss() callback if we've already
+ // dismissed the dialog manually in dismissInternal()
onDismiss(mDialog);
}
mDialog = null;
diff --git a/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/src/main/java/androidx/fragment/app/Fragment.java
index 419e869..c081639 100644
--- a/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -16,7 +16,7 @@
package androidx.fragment.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.annotation.SuppressLint;
@@ -66,12 +66,13 @@
import androidx.lifecycle.ViewModelStoreOwner;
import androidx.loader.app.LoaderManager;
import androidx.savedstate.SavedStateRegistry;
-import androidx.savedstate.bundle.BundleSavedStateRegistry;
-import androidx.savedstate.bundle.BundleSavedStateRegistryOwner;
+import androidx.savedstate.SavedStateRegistryController;
+import androidx.savedstate.SavedStateRegistryOwner;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
import java.util.UUID;
/**
@@ -90,7 +91,7 @@
*
*/
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
- ViewModelStoreOwner, BundleSavedStateRegistryOwner {
+ ViewModelStoreOwner, SavedStateRegistryOwner {
static final Object USE_DEFAULT_TRANSITION = new Object();
@@ -247,7 +248,10 @@
@Nullable FragmentViewLifecycleOwner mViewLifecycleOwner;
MutableLiveData<LifecycleOwner> mViewLifecycleOwnerLiveData = new MutableLiveData<>();
- BundleSavedStateRegistry mSavedStateRegistry = new BundleSavedStateRegistry();
+ SavedStateRegistryController mSavedStateRegistryController = new SavedStateRegistryController();
+
+ // Cache the ContentView layoutIds for Fragments.
+ private static final HashMap<Class, Integer> sAnnotationIds = new HashMap<>();
/**
* {@inheritDoc}
@@ -344,8 +348,8 @@
@NonNull
@Override
- public final SavedStateRegistry<Bundle> getBundleSavedStateRegistry() {
- return mSavedStateRegistry;
+ public final SavedStateRegistry getSavedStateRegistry() {
+ return mSavedStateRegistryController.getSavedStateRegistry();
}
/**
@@ -428,7 +432,6 @@
initLifecycle();
}
- @SuppressLint("RestrictedApi")
private void initLifecycle() {
mLifecycleRegistry = new LifecycleRegistry(this);
if (Build.VERSION.SDK_INT >= 19) {
@@ -541,7 +544,6 @@
}
@Override
- @SuppressLint({"UnknownNullness", "RestrictedApi"})
public String toString() {
StringBuilder sb = new StringBuilder(128);
DebugUtils.buildShortClassTag(this, sb);
@@ -1003,13 +1005,13 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
final public boolean hasOptionsMenu() {
return mHasMenu;
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
final public boolean isMenuVisible() {
return mMenuVisible;
}
@@ -1397,7 +1399,7 @@
*/
@Deprecated
@NonNull
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public LayoutInflater getLayoutInflater(@Nullable Bundle savedFragmentState) {
if (mHost == null) {
throw new IllegalStateException("onGetLayoutInflater() cannot be executed until the "
@@ -1574,7 +1576,7 @@
@CallSuper
public void onCreate(@Nullable Bundle savedInstanceState) {
mCalled = true;
- mSavedStateRegistry.performRestore(savedInstanceState);
+ mSavedStateRegistryController.performRestore(savedInstanceState);
restoreChildFragmentState(savedInstanceState);
if (mChildFragmentManager != null
&& !mChildFragmentManager.isStateAtLeast(Fragment.CREATED)) {
@@ -1635,13 +1637,19 @@
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- ContentView annotation = getClass().getAnnotation(ContentView.class);
- if (annotation != null) {
- int layoutId = annotation.value();
- if (layoutId != 0) {
- return inflater.inflate(layoutId, container, false);
+ Class<? extends Fragment> clazz = getClass();
+ if (!sAnnotationIds.containsKey(clazz)) {
+ ContentView annotation = clazz.getAnnotation(ContentView.class);
+ if (annotation != null) {
+ sAnnotationIds.put(clazz, annotation.value());
+ } else {
+ sAnnotationIds.put(clazz, null);
}
}
+ Integer layoutId = sAnnotationIds.get(clazz);
+ if (layoutId != null && layoutId != 0) {
+ return inflater.inflate(layoutId, container, false);
+ }
return null;
}
@@ -1844,7 +1852,7 @@
*/
void initState() {
initLifecycle();
- mSavedStateRegistry = new BundleSavedStateRegistry();
+ mSavedStateRegistryController = new SavedStateRegistryController();
mWho = UUID.randomUUID().toString();
mAdded = false;
mRemoving = false;
@@ -2716,7 +2724,7 @@
void performSaveInstanceState(Bundle outState) {
onSaveInstanceState(outState);
- mSavedStateRegistry.performSave(outState);
+ mSavedStateRegistryController.performSave(outState);
if (mChildFragmentManager != null) {
Parcelable p = mChildFragmentManager.saveAllState();
if (p != null) {
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java b/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java
index bd07f53..376c8d4 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java
@@ -16,7 +16,7 @@
package androidx.fragment.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -151,7 +151,6 @@
}
return;
}
- @SuppressLint("RestrictedApi")
ActivityCompat.PermissionCompatDelegate delegate =
ActivityCompat.getPermissionCompatDelegate();
if (delegate != null && delegate.onActivityResult(this, requestCode, resultCode, data)) {
@@ -418,6 +417,7 @@
* because the fragment manager thinks the state is still saved.
*/
@Override
+ @CallSuper
protected void onNewIntent(@SuppressLint("UnknownNullness") Intent intent) {
super.onNewIntent(intent);
mFragments.noteStateNotSaved();
@@ -480,7 +480,7 @@
* @hide
* @deprecated Override {@link #onPreparePanel(int, View, Menu)}.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Deprecated
protected boolean onPrepareOptionsPanel(@Nullable View view, @NonNull Menu menu) {
return super.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, view, menu);
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentController.java b/fragment/src/main/java/androidx/fragment/app/FragmentController.java
index 729909d..2086392 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentController.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentController.java
@@ -53,7 +53,6 @@
* Returns a {@link FragmentController}.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static FragmentController createController(@NonNull FragmentHostCallback<?> callbacks) {
return new FragmentController(checkNotNull(callbacks, "callbacks == null"));
}
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java b/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java
index dcc8619..f9d820f 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java
@@ -58,7 +58,6 @@
this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
}
- @SuppressLint("RestrictedApi")
FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
@NonNull Handler handler, int windowAnimations) {
mActivity = activity;
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 8e25caf..446002c 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -16,7 +16,7 @@
package androidx.fragment.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.os.Bundle;
@@ -136,7 +136,7 @@
* @hide -- remove once prebuilts are in.
* @deprecated
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Deprecated
@NonNull
public FragmentTransaction openTransaction() {
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java b/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java
index c62cda6..b4b8ea1 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentManagerImpl.java
@@ -22,7 +22,6 @@
import android.animation.AnimatorSet;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
@@ -63,7 +62,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -119,8 +117,6 @@
@Nullable
Fragment mPrimaryNav;
- static Field sAnimationListenerField = null;
-
boolean mNeedMenuInvalidate;
boolean mStateSaved;
boolean mStopped;
@@ -148,27 +144,26 @@
}
};
- static boolean modifiesAlpha(AnimationOrAnimator anim) {
- if (anim.animation instanceof AlphaAnimation) {
+ private static boolean modifiesAlpha(@Nullable Animation anim) {
+ if (anim == null) {
+ return false;
+ } else if (anim instanceof AlphaAnimation) {
return true;
- } else if (anim.animation instanceof AnimationSet) {
- List<Animation> anims = ((AnimationSet) anim.animation).getAnimations();
+ } else if (anim instanceof AnimationSet) {
+ List<Animation> anims = ((AnimationSet) anim).getAnimations();
for (int i = 0; i < anims.size(); i++) {
- if (anims.get(i) instanceof AlphaAnimation) {
+ if (modifiesAlpha(anims.get(i))) {
return true;
}
}
- return false;
- } else {
- return modifiesAlpha(anim.animator);
}
+ return false;
}
- static boolean modifiesAlpha(Animator anim) {
+ private static boolean modifiesAlpha(@Nullable Animator anim) {
if (anim == null) {
return false;
- }
- if (anim instanceof ValueAnimator) {
+ } else if (anim instanceof ValueAnimator) {
ValueAnimator valueAnim = (ValueAnimator) anim;
PropertyValuesHolder[] values = valueAnim.getValues();
for (int i = 0; i < values.length; i++) {
@@ -187,17 +182,23 @@
return false;
}
- static boolean shouldRunOnHWLayer(View v, AnimationOrAnimator anim) {
- if (v == null || anim == null) {
+ private static boolean shouldRunOnHwLayer(@Nullable View v, @Nullable Animation anim) {
+ return shouldAnimateOnHwLayer(v) && modifiesAlpha(anim);
+ }
+
+ private static boolean shouldRunOnHwLayer(@Nullable View v, @Nullable Animator anim) {
+ return shouldAnimateOnHwLayer(v) && modifiesAlpha(anim);
+ }
+
+ private static boolean shouldAnimateOnHwLayer(@Nullable View v) {
+ if (v == null) {
return false;
}
return Build.VERSION.SDK_INT >= 19
&& v.getLayerType() == View.LAYER_TYPE_NONE
- && ViewCompat.hasOverlappingRendering(v)
- && modifiesAlpha(anim);
+ && ViewCompat.hasOverlappingRendering(v);
}
- @SuppressLint("RestrictedApi")
private void throwException(RuntimeException ex) {
Log.e(TAG, ex.getMessage());
Log.e(TAG, "Activity state:");
@@ -425,7 +426,6 @@
}
@Override
- @SuppressLint("RestrictedApi")
public String toString() {
StringBuilder sb = new StringBuilder(128);
sb.append("FragmentManager{");
@@ -680,48 +680,36 @@
}
/**
- * Sets the to be animated view on hardware layer during the animation. Note
- * that calling this will replace any existing animation listener on the animation
- * with a new one, as animations do not support more than one listeners. Therefore,
- * animations that already have listeners should do the layer change operations
- * in their existing listeners, rather than calling this function.
+ * Sets the to be animated view on hardware layer during the animation and returns an
+ * AnimationSet consisting of only the given animation that replaces it. The replacement is done
+ * because animations do not support more than one listeners.
*/
- private static void setHWLayerAnimListenerIfAlpha(final View v, AnimationOrAnimator anim) {
- if (v == null || anim == null) {
- return;
+ @NonNull
+ private static Animation setHwLayerAnimationListenerIfAlpha(final View v,
+ @NonNull Animation anim) {
+ if (shouldRunOnHwLayer(v, anim)) {
+ // In case there's already a listener set on the animation, we need wrap the animation
+ // in an AnimationSet and set our listener on that set, so that they will both get
+ // animation listener callbacks.
+ v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ AnimationSet animationSet = new AnimationSet(false);
+ animationSet.addAnimation(anim);
+ animationSet.setAnimationListener(new AnimationOnHwLayerIfNeededListener(v));
+ return animationSet;
}
- if (shouldRunOnHWLayer(v, anim)) {
- if (anim.animator != null) {
- anim.animator.addListener(new AnimatorOnHWLayerIfNeededListener(v));
- } else {
- Animation.AnimationListener originalListener = getAnimationListener(anim.animation);
- // If there's already a listener set on the animation, we need wrap the new listener
- // around the existing listener, so that they will both get animation listener
- // callbacks.
- v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- anim.animation.setAnimationListener(new AnimateOnHWLayerIfNeededListener(v,
- originalListener));
- }
- }
+ return anim;
}
/**
- * Returns an existing AnimationListener on an Animation or {@code null} if none exists.
+ * Sets the to be animated view on hardware layer during the animation.
*/
- private static Animation.AnimationListener getAnimationListener(Animation animation) {
- Animation.AnimationListener originalListener = null;
- try {
- if (sAnimationListenerField == null) {
- sAnimationListenerField = Animation.class.getDeclaredField("mListener");
- sAnimationListenerField.setAccessible(true);
- }
- originalListener = (Animation.AnimationListener) sAnimationListenerField.get(animation);
- } catch (NoSuchFieldException e) {
- Log.e(TAG, "No field with the name mListener is found in Animation class", e);
- } catch (IllegalAccessException e) {
- Log.e(TAG, "Cannot access Animation's mListener field", e);
+ private static void setHwLayerAnimatorListenerIfAlpha(final View v, @NonNull Animator anim) {
+ if (v == null) {
+ return;
}
- return originalListener;
+ if (shouldRunOnHwLayer(v, anim)) {
+ anim.addListener(new AnimatorOnHwLayerIfNeededListener(v));
+ }
}
boolean isStateAtLeast(int state) {
@@ -1082,14 +1070,15 @@
fragment.setStateAfterAnimating(newState);
if (anim.animation != null) {
Animation animation =
- new EndViewTransitionAnimator(anim.animation, container, viewToAnimate);
+ new EndViewTransitionAnimation(anim.animation, container, viewToAnimate);
fragment.setAnimatingAway(fragment.mView);
- Animation.AnimationListener listener = getAnimationListener(animation);
- animation.setAnimationListener(new AnimationListenerWrapper(listener) {
+ animation.setAnimationListener(new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+ }
+
@Override
public void onAnimationEnd(Animation animation) {
- super.onAnimationEnd(animation);
-
// onAnimationEnd() comes during draw(), so there can still be some
// draw events happening after this call. We don't want to detach
// the view until after the onAnimationEnd()
@@ -1104,12 +1093,16 @@
}
});
}
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+ }
});
- setHWLayerAnimListenerIfAlpha(viewToAnimate, anim);
+ animation = setHwLayerAnimationListenerIfAlpha(viewToAnimate, animation);
fragment.mView.startAnimation(animation);
} else {
Animator animator = anim.animator;
- fragment.setAnimator(anim.animator);
+ fragment.setAnimator(animator);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator anim) {
@@ -1124,7 +1117,7 @@
}
});
animator.setTarget(fragment.mView);
- setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
+ setHwLayerAnimatorListenerIfAlpha(fragment.mView, animator);
animator.start();
}
}
@@ -1188,13 +1181,14 @@
} else {
fragment.mView.setVisibility(View.VISIBLE);
}
- setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
+ setHwLayerAnimatorListenerIfAlpha(fragment.mView, anim.animator);
anim.animator.start();
} else {
if (anim != null) {
- setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
- fragment.mView.startAnimation(anim.animation);
- anim.animation.start();
+ Animation animation = setHwLayerAnimationListenerIfAlpha(fragment.mView,
+ anim.animation);
+ fragment.mView.startAnimation(animation);
+ animation.start();
}
final int visibility = fragment.mHidden && !fragment.isHideReplaced()
? View.GONE
@@ -1256,14 +1250,14 @@
// run animations:
AnimationOrAnimator anim = loadAnimation(f, f.getNextTransition(), true,
f.getNextTransitionStyle());
- if (anim != null) {
- setHWLayerAnimListenerIfAlpha(f.mView, anim);
- if (anim.animation != null) {
- f.mView.startAnimation(anim.animation);
- } else {
- anim.animator.setTarget(f.mView);
- anim.animator.start();
- }
+ if (anim != null && anim.animation != null) {
+ Animation animation = setHwLayerAnimationListenerIfAlpha(f.mView,
+ anim.animation);
+ f.mView.startAnimation(animation);
+ } else if (anim != null) {
+ anim.animator.setTarget(f.mView);
+ setHwLayerAnimatorListenerIfAlpha(f.mView, anim.animator);
+ anim.animator.start();
}
}
}
@@ -2425,7 +2419,6 @@
restoreSaveState(state);
}
- @SuppressLint("RestrictedApi")
void restoreSaveState(Parcelable state) {
// If there is no saved state at all, then there's nothing else to do
if (state == null) return;
@@ -3333,52 +3326,20 @@
}
/**
- * Wrap an AnimationListener that can be null. This allows us to chain animation listeners.
- */
- private static class AnimationListenerWrapper implements Animation.AnimationListener {
- private final Animation.AnimationListener mWrapped;
-
- AnimationListenerWrapper(Animation.AnimationListener wrapped) {
- mWrapped = wrapped;
- }
-
- @CallSuper
- @Override
- public void onAnimationStart(Animation animation) {
- if (mWrapped != null) {
- mWrapped.onAnimationStart(animation);
- }
- }
-
- @CallSuper
- @Override
- public void onAnimationEnd(Animation animation) {
- if (mWrapped != null) {
- mWrapped.onAnimationEnd(animation);
- }
- }
-
- @CallSuper
- @Override
- public void onAnimationRepeat(Animation animation) {
- if (mWrapped != null) {
- mWrapped.onAnimationRepeat(animation);
- }
- }
- }
-
- /**
* Reset the layer type to LAYER_TYPE_NONE at the end of an animation.
*/
- private static class AnimateOnHWLayerIfNeededListener extends AnimationListenerWrapper {
+ private static class AnimationOnHwLayerIfNeededListener implements Animation.AnimationListener {
View mView;
- AnimateOnHWLayerIfNeededListener(final View v, Animation.AnimationListener listener) {
- super(listener);
+ AnimationOnHwLayerIfNeededListener(final View v) {
mView = v;
}
@Override
+ public void onAnimationStart(Animation animation) {
+ }
+
+ @Override
@CallSuper
public void onAnimationEnd(Animation animation) {
// If we're attached to a window, assume we're in the normal performTraversals
@@ -3401,17 +3362,20 @@
} else {
mView.setLayerType(View.LAYER_TYPE_NONE, null);
}
- super.onAnimationEnd(animation);
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
}
}
/**
* Set the layer type to LAYER_TYPE_HARDWARE while an animator is running.
*/
- private static class AnimatorOnHWLayerIfNeededListener extends AnimatorListenerAdapter {
+ private static class AnimatorOnHwLayerIfNeededListener extends AnimatorListenerAdapter {
View mView;
- AnimatorOnHWLayerIfNeededListener(final View v) {
+ AnimatorOnHwLayerIfNeededListener(final View v) {
mView = v;
}
@@ -3433,14 +3397,14 @@
* with Views remaining in the hierarchy as disappearing children after the view has been
* removed in some edge cases.
*/
- private static class EndViewTransitionAnimator extends AnimationSet implements Runnable {
+ private static class EndViewTransitionAnimation extends AnimationSet implements Runnable {
private final ViewGroup mParent;
private final View mChild;
private boolean mEnded;
private boolean mTransitionEnded;
private boolean mAnimating = true;
- EndViewTransitionAnimator(@NonNull Animation animation,
+ EndViewTransitionAnimation(@NonNull Animation animation,
@NonNull ViewGroup parent, @NonNull View child) {
super(false);
mParent = parent;
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java b/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
index 5d4de22..17baa9e 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
@@ -16,7 +16,7 @@
package androidx.fragment.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.view.View;
@@ -198,7 +198,7 @@
public static final int TRANSIT_EXIT_MASK = 0x2000;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, TRANSIT_FRAGMENT_CLOSE, TRANSIT_FRAGMENT_FADE})
@Retention(RetentionPolicy.SOURCE)
private @interface Transit {}
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java b/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
index 7aeeab7..ccd121e 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
@@ -16,7 +16,7 @@
package androidx.fragment.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.graphics.Rect;
@@ -37,7 +37,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("UnknownNullness")
public abstract class FragmentTransitionImpl {
diff --git a/fragment/testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.java b/fragment/testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.java
index 4d910fc..473fa4a 100644
--- a/fragment/testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.java
+++ b/fragment/testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.java
@@ -324,7 +324,6 @@
* This method cannot be called from the main thread.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public FragmentScenario<F> moveToState(@NonNull State newState) {
if (newState == State.DESTROYED) {
mActivityScenario.onActivity(
@@ -404,7 +403,6 @@
* This method cannot be called from the main thread.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public FragmentScenario<F> onFragment(@NonNull final FragmentAction<F> action) {
mActivityScenario.onActivity(
new ActivityScenario.ActivityAction<EmptyFragmentActivity>() {
diff --git a/graphics/drawable/animated/api/1.1.0-alpha02.txt b/graphics/drawable/animated/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..7542e29
--- /dev/null
+++ b/graphics/drawable/animated/api/1.1.0-alpha02.txt
@@ -0,0 +1,35 @@
+// Signature format: 3.0
+package androidx.vectordrawable.graphics.drawable {
+
+ public interface Animatable2Compat extends android.graphics.drawable.Animatable {
+ method public void clearAnimationCallbacks();
+ method public void registerAnimationCallback(androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback);
+ method public boolean unregisterAnimationCallback(androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback);
+ }
+
+ public abstract static class Animatable2Compat.AnimationCallback {
+ ctor public Animatable2Compat.AnimationCallback();
+ method public void onAnimationEnd(android.graphics.drawable.Drawable!);
+ method public void onAnimationStart(android.graphics.drawable.Drawable!);
+ }
+
+ public class AnimatedVectorDrawableCompat extends android.graphics.drawable.Drawable implements androidx.vectordrawable.graphics.drawable.Animatable2Compat androidx.core.graphics.drawable.TintAwareDrawable {
+ method public void clearAnimationCallbacks();
+ method public static void clearAnimationCallbacks(android.graphics.drawable.Drawable!);
+ method public static androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat? create(android.content.Context, @DrawableRes int);
+ method public static androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat! createFromXmlInner(android.content.Context!, android.content.res.Resources!, org.xmlpull.v1.XmlPullParser!, android.util.AttributeSet!, android.content.res.Resources.Theme!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas!);
+ method public int getOpacity();
+ method public boolean isRunning();
+ method public void registerAnimationCallback(androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback);
+ method public static void registerAnimationCallback(android.graphics.drawable.Drawable!, androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback!);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void start();
+ method public void stop();
+ method public boolean unregisterAnimationCallback(androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback);
+ method public static boolean unregisterAnimationCallback(android.graphics.drawable.Drawable!, androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback!);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/graphics/drawable/animated/api/res-1.1.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to graphics/drawable/animated/api/res-1.1.0-alpha02.txt
diff --git a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimationUtilsCompat.java b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimationUtilsCompat.java
index 2110f3c..d560b87 100644
--- a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimationUtilsCompat.java
+++ b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimationUtilsCompat.java
@@ -16,7 +16,7 @@
package androidx.vectordrawable.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -52,7 +52,7 @@
* Defines common utilities for working with animations.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AnimationUtilsCompat {
/**
* Loads an {@link Interpolator} object from a resource
diff --git a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimatorInflaterCompat.java b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimatorInflaterCompat.java
index f60713e..cc797b0 100644
--- a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimatorInflaterCompat.java
+++ b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/AnimatorInflaterCompat.java
@@ -16,7 +16,7 @@
package androidx.vectordrawable.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static java.lang.Math.min;
@@ -65,7 +65,7 @@
* <em>something</em> file.)
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AnimatorInflaterCompat {
private static final String TAG = "AnimatorInflater";
/**
diff --git a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/ArgbEvaluator.java b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/ArgbEvaluator.java
index 9225ef2..e0fdf6e 100644
--- a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/ArgbEvaluator.java
+++ b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/ArgbEvaluator.java
@@ -16,7 +16,7 @@
package androidx.vectordrawable.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
@@ -28,7 +28,7 @@
* values that represent ARGB colors.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ArgbEvaluator implements TypeEvaluator {
private static final ArgbEvaluator sInstance = new ArgbEvaluator();
diff --git a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/PathInterpolatorCompat.java b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/PathInterpolatorCompat.java
index e611c8e..a18f8d3 100644
--- a/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/PathInterpolatorCompat.java
+++ b/graphics/drawable/animated/src/main/java/androidx/vectordrawable/graphics/drawable/PathInterpolatorCompat.java
@@ -15,7 +15,7 @@
*/
package androidx.vectordrawable.graphics.drawable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static java.lang.Math.abs;
import static java.lang.Math.min;
@@ -52,7 +52,7 @@
* </pre></blockquote></p>
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class PathInterpolatorCompat implements Interpolator {
// This governs how accurate the approximation of the Path is.
diff --git a/graphics/drawable/static/api/1.1.0-alpha02.txt b/graphics/drawable/static/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..3fda85b
--- /dev/null
+++ b/graphics/drawable/static/api/1.1.0-alpha02.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.vectordrawable.graphics.drawable {
+
+ public class VectorDrawableCompat extends android.graphics.drawable.Drawable implements androidx.core.graphics.drawable.TintAwareDrawable {
+ method public static androidx.vectordrawable.graphics.drawable.VectorDrawableCompat? create(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.vectordrawable.graphics.drawable.VectorDrawableCompat! createFromXmlInner(android.content.res.Resources!, org.xmlpull.v1.XmlPullParser!, android.util.AttributeSet!, android.content.res.Resources.Theme!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas!);
+ method public int getOpacity();
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/graphics/drawable/static/api/res-1.1.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to graphics/drawable/static/api/res-1.1.0-alpha02.txt
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index d176f0d..ea9130d 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -7,7 +7,7 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":annotation"))
api(project(":core"))
implementation(project(":collection"))
diff --git a/graphics/drawable/static/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java
index bd9e707..68bac39 100644
--- a/graphics/drawable/static/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java
@@ -22,7 +22,7 @@
import static android.graphics.Paint.Style.FILL;
import static android.graphics.Paint.Style.STROKE;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.res.ColorStateList;
@@ -613,7 +613,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public float getPixelSize() {
if (mVectorState == null || mVectorState.mVPathRenderer == null
|| mVectorState.mVPathRenderer.mBaseWidth == 0
diff --git a/heifwriter/api/1.1.0-alpha01.txt b/heifwriter/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..607f763
--- /dev/null
+++ b/heifwriter/api/1.1.0-alpha01.txt
@@ -0,0 +1,31 @@
+// Signature format: 3.0
+package androidx.heifwriter {
+
+ public final class HeifWriter implements java.lang.AutoCloseable {
+ method public void addBitmap(android.graphics.Bitmap);
+ method public void addExifData(int, byte[], int, int);
+ 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
+ }
+
+ public static final class HeifWriter.Builder {
+ ctor public HeifWriter.Builder(String, int, int, int);
+ ctor public HeifWriter.Builder(java.io.FileDescriptor, int, int, int);
+ method public androidx.heifwriter.HeifWriter! build() throws java.io.IOException;
+ method public androidx.heifwriter.HeifWriter.Builder! setGridEnabled(boolean);
+ method public androidx.heifwriter.HeifWriter.Builder! setHandler(android.os.Handler?);
+ method public androidx.heifwriter.HeifWriter.Builder! setMaxImages(int);
+ method public androidx.heifwriter.HeifWriter.Builder! setPrimaryIndex(int);
+ method public androidx.heifwriter.HeifWriter.Builder! setQuality(int);
+ method public androidx.heifwriter.HeifWriter.Builder! setRotation(int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/heifwriter/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to heifwriter/api/res-1.1.0-alpha01.txt
diff --git a/interpolator/api/1.1.0-alpha01.txt b/interpolator/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..5ce1a38
--- /dev/null
+++ b/interpolator/api/1.1.0-alpha01.txt
@@ -0,0 +1,20 @@
+// Signature format: 3.0
+package androidx.interpolator.view.animation {
+
+ public class FastOutLinearInInterpolator implements android.view.animation.Interpolator {
+ ctor public FastOutLinearInInterpolator();
+ method public float getInterpolation(float);
+ }
+
+ public class FastOutSlowInInterpolator implements android.view.animation.Interpolator {
+ ctor public FastOutSlowInInterpolator();
+ method public float getInterpolation(float);
+ }
+
+ public class LinearOutSlowInInterpolator implements android.view.animation.Interpolator {
+ ctor public LinearOutSlowInInterpolator();
+ method public float getInterpolation(float);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/interpolator/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to interpolator/api/res-1.1.0-alpha01.txt
diff --git a/jetifier/jetifier/core/src/main/resources/default.config b/jetifier/jetifier/core/src/main/resources/default.config
index 5257f15..8ac50f4 100644
--- a/jetifier/jetifier/core/src/main/resources/default.config
+++ b/jetifier/jetifier/core/src/main/resources/default.config
@@ -43,6 +43,11 @@
"from": "android/support/test/((.*)/)?internal/(.*)",
"to": "ignore"
},
+ # b/123651524
+ {
+ "from": "android/support/v4/os/ResultReceiver(.*)",
+ "to": "ignore"
+ },
# Don't transform parcelizer generated classes
# This maintains compatibility across dejetified and androidx libraries
{
@@ -93,10 +98,6 @@
"to": "androidx/appcompat/R{0}"
},
{
- "from": "android/support/v7/appcompat/resources/R(.*)",
- "to": "androidx/appcompat/resources/R{0}"
- },
- {
"from": "android/support/v7/mediarouter/R(.*)",
"to": "androidx/mediarouter/R{0}"
},
@@ -331,10 +332,6 @@
"to": "androidx/appcompat/{0}"
},
{
- "from": "android/support/v7/resources/(.*)",
- "to": "androidx/appcompat/resources/{0}"
- },
- {
"from": "android/support/graphics/drawable/(.*)",
"to": "androidx/vectordrawable/graphics/drawable/{0}"
},
@@ -963,24 +960,6 @@
"to": "ignore"
},
- #Activity
- {
- "from": "androidx/activity/(.*)",
- "to": "ignore"
- },
-
- #SavedState
- {
- "from": "androidx/savedstate/(.*)",
- "to": "ignore"
- },
-
- #RemoteCallback
- {
- "from": "androidx/remotecallback/(.*)",
- "to": "ignore"
- },
-
# Fallback for new media stuff
{
"from": "androidx/media/(.*)",
@@ -1110,10 +1089,6 @@
"to" = "androidx/appcompat"
},
{
- "from" = "android/support/v7/appcompat/resources",
- "to" = "androidx/appcompat/resources"
- },
- {
"from" = "android/support/v7/recyclerview",
"to" = "androidx/recyclerview"
},
@@ -1242,22 +1217,6 @@
"to" = "androidx/versionedparcelable"
},
{
- "from" = "androidx/remotecallback",
- "to" = "androidx/remotecallback"
- },
- {
- "from" = "androidx/activity",
- "to" = "androidx/activity"
- },
- {
- "from" = "androidx/savedstate/bundle",
- "to" = "androidx/savedstate/bundle"
- },
- {
- "from" = "androidx/savedstate/common",
- "to" = "androidx/savedstate/common"
- },
- {
"from" = "androidx/slice/view",
"to" = "androidx/slice/view"
},
@@ -1348,26 +1307,10 @@
"to": { "groupId": "androidx.vectordrawable", "artifactId": "vectordrawable-animated", "version": "{newSlVersion}" }
},
{
- "from": { "groupId": "androidx.activity", "artifactId": "activity", "version": "{newSlVersion}" },
- "to": { "groupId": "androidx.activity", "artifactId": "activity", "version": "{newSlVersion}" }
- },
- {
- "from": { "groupId": "androidx.savedstate", "artifactId": "savedstate-common", "version": "{newSlVersion}" },
- "to": { "groupId": "androidx.savedstate", "artifactId": "savedstate-common", "version": "{newSlVersion}" }
- },
- {
- "from": { "groupId": "androidx.savedstate", "artifactId": "savedstate-bundle", "version": "{newSlVersion}" },
- "to": { "groupId": "androidx.savedstate", "artifactId": "savedstate-bundle", "version": "{newSlVersion}" }
- },
- {
"from": { "groupId": "com.android.support", "artifactId": "appcompat-v7", "version": "{oldSlVersion}" },
"to": { "groupId": "androidx.appcompat", "artifactId": "appcompat", "version": "{newSlVersion}" }
},
{
- "from": { "groupId": "com.android.support", "artifactId": "appcompat-resources", "version": "{oldSlVersion}" },
- "to": { "groupId": "androidx.appcompat", "artifactId": "appcompat-resources", "version": "{newSlVersion}" }
- },
- {
"from": { "groupId": "com.android.support", "artifactId": "cardview-v7", "version": "{oldSlVersion}" },
"to": { "groupId": "androidx.cardview", "artifactId": "cardview", "version": "{newSlVersion}" }
},
@@ -1583,10 +1526,6 @@
"from": { "groupId": "com.android.support", "artifactId": "versionedparcelable", "version": "{oldSlVersion}" },
"to": { "groupId": "androidx.versionedparcelable", "artifactId": "versionedparcelable", "version": "{newSlVersion}" }
},
- {
- "from": { "groupId": "androidx.remotecallback", "artifactId": "remotecallback", "version": "{newSlVersion}" },
- "to": { "groupId": "androidx.remotecallback", "artifactId": "remotecallback", "version": "{newSlVersion}" }
- },
#{
# "from": { "groupId": "android.arch.background.workmanager", "artifactId": "workmanager", "version": "{newArchVersion}" },
# "to": { "groupId": "androidx.work", "artifactId": "runtime", "version": "{newArchVersion}" }
@@ -1821,7 +1760,7 @@
"oldSlVersion": "28.0.0",
"oldMaterialVersion": "28.0.0",
"oldRoomVersion": "1.1.0",
- "oldCarVersion": "28.0.0-alpha6",
+ "oldCarVersion": "28.0.0-alpha5",
"oldMediarouterVersion": "28.0.0-alpha5",
"oldMedia2Version": "28.0.0-alpha03",
"oldExoplayerVersion": "28.0.0-alpha01",
@@ -1830,13 +1769,13 @@
"newMaterialVersion": "1.0.0",
"newArchCoreVersion": "2.0.0",
"newLifecycleVersion": "2.0.0",
- "newPagingVersion": "2.0.0-rc01",
- "newRoomVersion": "2.0.0-rc01",
+ "newPagingVersion": "2.0.0",
+ "newRoomVersion": "2.0.0",
"newEspressoVersion": "3.1.0-alpha3",
"newTestsVersion": "1.1.0-alpha3",
"newJankTestHelperVersion": "1.0.1-alpha3",
"newUiAutomatorVersion": "2.2.0-alpha3",
- "newCarVersion": "1.0.0-alpha6",
+ "newCarVersion": "1.0.0-alpha5",
"newMediarouterVersion": "1.0.0-alpha5",
"newMedia2Version": "1.0.0-alpha03",
"newExoplayerVersion": "1.0.0-alpha01",
diff --git a/jetifier/jetifier/core/src/main/resources/default.generated.config b/jetifier/jetifier/core/src/main/resources/default.generated.config
index a3595d8..aed4839 100644
--- a/jetifier/jetifier/core/src/main/resources/default.generated.config
+++ b/jetifier/jetifier/core/src/main/resources/default.generated.config
@@ -45,6 +45,10 @@
"to": "ignore"
},
{
+ "from": "android/support/v4/os/ResultReceiver(.*)",
+ "to": "ignore"
+ },
+ {
"from": "(.*)Parcelizer",
"to": "{0}Parcelizer"
},
@@ -89,10 +93,6 @@
"to": "androidx/appcompat/R{0}"
},
{
- "from": "android/support/v7/appcompat/resources/R(.*)",
- "to": "androidx/appcompat/resources/R{0}"
- },
- {
"from": "android/support/v7/mediarouter/R(.*)",
"to": "androidx/mediarouter/R{0}"
},
@@ -317,10 +317,6 @@
"to": "androidx/appcompat/{0}"
},
{
- "from": "android/support/v7/resources/(.*)",
- "to": "androidx/appcompat/resources/{0}"
- },
- {
"from": "android/support/graphics/drawable/(.*)",
"to": "androidx/vectordrawable/graphics/drawable/{0}"
},
@@ -919,18 +915,6 @@
"to": "ignore"
},
{
- "from": "androidx/activity/(.*)",
- "to": "ignore"
- },
- {
- "from": "androidx/savedstate/(.*)",
- "to": "ignore"
- },
- {
- "from": "androidx/remotecallback/(.*)",
- "to": "ignore"
- },
- {
"from": "androidx/media/(.*)",
"to": "android/support/v4/media/{0}"
},
@@ -1057,10 +1041,6 @@
"to": "androidx/appcompat"
},
{
- "from": "android/support/v7/appcompat/resources/",
- "to": "androidx/appcompat/resources"
- },
- {
"from": "android/support/v7/recyclerview",
"to": "androidx/recyclerview"
},
@@ -1189,22 +1169,6 @@
"to": "androidx/versionedparcelable"
},
{
- "from": "androidx/remotecallback",
- "to": "androidx/remotecallback"
- },
- {
- "from": "androidx/activity",
- "to": "androidx/activity"
- },
- {
- "from": "androidx/savedstate/bundle",
- "to": "androidx/savedstate/bundle"
- },
- {
- "from": "androidx/savedstate/common",
- "to": "androidx/savedstate/common"
- },
- {
"from": "androidx/slice/view",
"to": "androidx/slice/view"
},
@@ -1304,42 +1268,6 @@
},
{
"from": {
- "groupId": "androidx.activity",
- "artifactId": "activity",
- "version": "{newSlVersion}"
- },
- "to": {
- "groupId": "androidx.activity",
- "artifactId": "activity",
- "version": "{newSlVersion}"
- }
- },
- {
- "from": {
- "groupId": "androidx.savedstate",
- "artifactId": "savedstate-common",
- "version": "{newSlVersion}"
- },
- "to": {
- "groupId": "androidx.savedstate",
- "artifactId": "savedstate-common",
- "version": "{newSlVersion}"
- }
- },
- {
- "from": {
- "groupId": "androidx.savedstate",
- "artifactId": "savedstate-bundle",
- "version": "{newSlVersion}"
- },
- "to": {
- "groupId": "androidx.savedstate",
- "artifactId": "savedstate-bundle",
- "version": "{newSlVersion}"
- }
- },
- {
- "from": {
"groupId": "com.android.support",
"artifactId": "appcompat-v7",
"version": "{oldSlVersion}"
@@ -1353,18 +1281,6 @@
{
"from": {
"groupId": "com.android.support",
- "artifactId": "appcompat-resources",
- "version": "{oldSlVersion}"
- },
- "to": {
- "groupId": "androidx.appcompat",
- "artifactId": "appcompat-resources",
- "version": "{newSlVersion}"
- }
- },
- {
- "from": {
- "groupId": "com.android.support",
"artifactId": "cardview-v7",
"version": "{oldSlVersion}"
},
@@ -2012,18 +1928,6 @@
},
{
"from": {
- "groupId": "androidx.remotecallback",
- "artifactId": "remotecallback",
- "version": "{newSlVersion}"
- },
- "to": {
- "groupId": "androidx.remotecallback",
- "artifactId": "remotecallback",
- "version": "{newSlVersion}"
- }
- },
- {
- "from": {
"groupId": "android.arch.core",
"artifactId": "common",
"version": "1.1.1"
@@ -2640,7 +2544,7 @@
"oldSlVersion": "28.0.0",
"oldMaterialVersion": "28.0.0",
"oldRoomVersion": "1.1.0",
- "oldCarVersion": "28.0.0-alpha6",
+ "oldCarVersion": "28.0.0-alpha5",
"oldMediarouterVersion": "28.0.0-alpha5",
"oldMedia2Version": "28.0.0-alpha03",
"oldExoplayerVersion": "28.0.0-alpha01",
@@ -2649,13 +2553,13 @@
"newMaterialVersion": "1.0.0",
"newArchCoreVersion": "2.0.0",
"newLifecycleVersion": "2.0.0",
- "newPagingVersion": "2.0.0-rc01",
- "newRoomVersion": "2.0.0-rc01",
+ "newPagingVersion": "2.0.0",
+ "newRoomVersion": "2.0.0",
"newEspressoVersion": "3.1.0-alpha3",
"newTestsVersion": "1.1.0-alpha3",
"newJankTestHelperVersion": "1.0.1-alpha3",
"newUiAutomatorVersion": "2.2.0-alpha3",
- "newCarVersion": "1.0.0-alpha6",
+ "newCarVersion": "1.0.0-alpha5",
"newMediarouterVersion": "1.0.0-alpha5",
"newMedia2Version": "1.0.0-alpha03",
"newExoplayerVersion": "1.0.0-alpha01",
@@ -4182,7 +4086,6 @@
"android/support/v4/os/ParcelCompat": "androidx/core/os/ParcelCompat",
"android/support/v4/os/ParcelableCompat": "androidx/core/os/ParcelableCompat",
"android/support/v4/os/ParcelableCompatCreatorCallbacks": "androidx/core/os/ParcelableCompatCreatorCallbacks",
- "android/support/v4/os/ResultReceiver": "androidx/core/os/ResultReceiver",
"android/support/v4/os/TraceCompat": "androidx/core/os/TraceCompat",
"android/support/v4/os/UserManagerCompat": "androidx/core/os/UserManagerCompat",
"android/support/v4/print/PrintHelper": "androidx/print/PrintHelper",
@@ -4639,7 +4542,6 @@
],
"android/support/v7/{any}": [
"androidx/appcompat/{any}",
- "androidx/appcompat/resources/{any}",
"androidx/mediarouter/{any}",
"androidx/cardview/{any}",
"androidx/palette/{any}",
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index ae882c6..1acdde8 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -64,10 +64,6 @@
"to": "androidx/coordinatorlayout/R{0}"
},
{
- "from": "android/support/text/emoji/R(.*)",
- "to": "androidx/emoji/R{0}"
- },
- {
"from": "android/support/v7/recyclerview/R(.*)",
"to": "androidx/recyclerview/R{0}"
},
@@ -308,18 +304,6 @@
"to": "androidx/transition/{0}"
},
{
- "from": "android/support/text/emoji/bundled/BundledEmojiCompatConfig(.*)",
- "to": "androidx/emoji/bundled/BundledEmojiCompatConfig{0}"
- },
- {
- "from": "android/support/text/emoji/widget/(.*)",
- "to": "androidx/emoji/widget/{0}"
- },
- {
- "from": "android/support/text/emoji/(.*)",
- "to": "androidx/emoji/text/{0}"
- },
- {
"from": "android/support/v4/view/animation/PathInterpolatorApi14(.*)",
"to": "androidx/core/view/animation/PathInterpolatorApi14{0}"
},
@@ -488,26 +472,10 @@
"to": "androidx/drawerlayout/widget/DrawerLayout{0}"
},
{
- "from": "android/support/v4/widget/SlidingPaneLayout(.*)",
- "to": "androidx/slidingpanelayout/widget/SlidingPaneLayout{0}"
- },
- {
"from": "android/support/v4/view/AsyncLayoutInflater(.*)",
"to": "androidx/asynclayoutinflater/view/AsyncLayoutInflater{0}"
},
{
- "from": "android/support/v4/widget/SwipeRefreshLayout(.*)",
- "to": "androidx/swiperefreshlayout/widget/SwipeRefreshLayout{0}"
- },
- {
- "from": "android/support/v4/widget/CircularProgressDrawable(.*)",
- "to": "androidx/swiperefreshlayout/widget/CircularProgressDrawable{0}"
- },
- {
- "from": "android/support/v4/widget/CircleImageView(.*)",
- "to": "androidx/swiperefreshlayout/widget/CircleImageView{0}"
- },
- {
"from": "android/support/v4/util/ArrayMap(.*)",
"to": "androidx/collection/ArrayMap{0}"
},
@@ -754,6 +722,34 @@
"to": "ignore"
},
{
+ "from": "androidx/swiperefreshlayout/widget/CircleImageView(.*)",
+ "to": "ignore"
+ },
+ {
+ "from": "androidx/swiperefreshlayout/widget/CircularProgressDrawable(.*)",
+ "to": "ignore"
+ },
+ {
+ "from": "androidx/swiperefreshlayout/widget/SwipeRefreshLayout(.*)",
+ "to": "ignore"
+ },
+ {
+ "from": "androidx/emoji/R(.*)",
+ "to": "ignore"
+ },
+ {
+ "from": "androidx/emoji/bundled/BundledEmojiCompatConfig(.*)",
+ "to": "ignore"
+ },
+ {
+ "from": "androidx/emoji/widget/(.*)",
+ "to": "ignore"
+ },
+ {
+ "from": "androidx/emoji/text/(.*)",
+ "to": "ignore"
+ },
+ {
"from": "androidx/biometric/(.*)",
"to": "ignore"
},
@@ -838,6 +834,10 @@
"to": "ignore"
},
{
+ "from": "androidx/slidingpanelayout/widget/SlidingPaneLayout(.*)",
+ "to": "ignore"
+ },
+ {
"from": "androidx/slice/(.*)",
"to": "ignore"
},
@@ -956,11 +956,11 @@
"to": "androidx/coordinatorlayout"
},
{
- "from": "android/support/swiperefreshlayout",
+ "from": "androidx/swiperefreshlayout",
"to": "androidx/swiperefreshlayout"
},
{
- "from": "android/support/slidingpanelayout",
+ "from": "androidx/slidingpanelayout",
"to": "androidx/slidingpanelayout"
},
{
@@ -1100,15 +1100,15 @@
"to": "com/google/android/material"
},
{
- "from": "android/support/text/emoji/appcompat",
+ "from": "androidx/emoji/appcompat",
"to": "androidx/emoji/appcompat"
},
{
- "from": "android/support/text/emoji/bundled",
+ "from": "androidx/emoji/bundled",
"to": "androidx/emoji/bundled"
},
{
- "from": "android/support/text/emoji",
+ "from": "androidx/emoji",
"to": "androidx/emoji"
},
{
@@ -1120,10 +1120,6 @@
"to": "androidx/localbroadcastmanager"
},
{
- "from": "androidx/text/emoji/bundled",
- "to": "androidx/text/emoji/bundled"
- },
- {
"from": "androidx/webkit",
"to": "androidx/webkit"
},
@@ -1132,12 +1128,8 @@
"to": "androidx/remotecallback"
},
{
- "from": "androidx/savedstate/bundle",
- "to": "androidx/savedstate/bundle"
- },
- {
- "from": "androidx/savedstate/common",
- "to": "androidx/savedstate/common"
+ "from": "androidx/savedstate",
+ "to": "androidx/savedstate"
},
{
"from": "androidx/slice/view",
@@ -1252,24 +1244,12 @@
{
"from": {
"groupId": "androidx.savedstate",
- "artifactId": "savedstate-common",
+ "artifactId": "savedstate",
"version": "{newSlVersion}"
},
"to": {
"groupId": "androidx.savedstate",
- "artifactId": "savedstate-common",
- "version": "{newSlVersion}"
- }
- },
- {
- "from": {
- "groupId": "androidx.savedstate",
- "artifactId": "savedstate-bundle",
- "version": "{newSlVersion}"
- },
- "to": {
- "groupId": "androidx.savedstate",
- "artifactId": "savedstate-bundle",
+ "artifactId": "savedstate",
"version": "{newSlVersion}"
}
},
@@ -1563,9 +1543,9 @@
},
{
"from": {
- "groupId": "com.android.support",
- "artifactId": "support-emoji",
- "version": "{oldSlVersion}"
+ "groupId": "androidx.emoji",
+ "artifactId": "emoji",
+ "version": "{newSlVersion}"
},
"to": {
"groupId": "androidx.emoji",
@@ -1575,9 +1555,9 @@
},
{
"from": {
- "groupId": "com.android.support",
- "artifactId": "support-emoji-appcompat",
- "version": "{oldSlVersion}"
+ "groupId": "androidx.emoji",
+ "artifactId": "emoji-appcompat",
+ "version": "{newSlVersion}"
},
"to": {
"groupId": "androidx.emoji",
@@ -1587,9 +1567,9 @@
},
{
"from": {
- "groupId": "com.android.support",
- "artifactId": "support-emoji-bundled",
- "version": "{oldSlVersion}"
+ "groupId": "androidx.emoji",
+ "artifactId": "emoji-bundled",
+ "version": "{newSlVersion}"
},
"to": {
"groupId": "androidx.emoji",
@@ -1839,9 +1819,9 @@
},
{
"from": {
- "groupId": "com.android.support",
+ "groupId": "androidx.slidingpanelayout",
"artifactId": "slidingpanelayout",
- "version": "{oldSlVersion}"
+ "version": "{newSlVersion}"
},
"to": {
"groupId": "androidx.slidingpanelayout",
@@ -1851,9 +1831,9 @@
},
{
"from": {
- "groupId": "com.android.support",
+ "groupId": "androidx.swiperefreshlayout",
"artifactId": "swiperefreshlayout",
- "version": "{oldSlVersion}"
+ "version": "{newSlVersion}"
},
"to": {
"groupId": "androidx.swiperefreshlayout",
@@ -3613,35 +3593,6 @@
"android/support/test/uiautomator/UiWatcher": "androidx/test/uiautomator/UiWatcher",
"android/support/test/uiautomator/Until": "androidx/test/uiautomator/Until",
"android/support/test/uiautomator/WaitMixin": "androidx/test/uiautomator/WaitMixin",
- "android/support/text/emoji/EmojiCompat": "androidx/emoji/text/EmojiCompat",
- "android/support/text/emoji/EmojiMetadata": "androidx/emoji/text/EmojiMetadata",
- "android/support/text/emoji/EmojiProcessor": "androidx/emoji/text/EmojiProcessor",
- "android/support/text/emoji/EmojiSpan": "androidx/emoji/text/EmojiSpan",
- "android/support/text/emoji/FontRequestEmojiCompatConfig": "androidx/emoji/text/FontRequestEmojiCompatConfig",
- "android/support/text/emoji/MetadataListReader": "androidx/emoji/text/MetadataListReader",
- "android/support/text/emoji/MetadataRepo": "androidx/emoji/text/MetadataRepo",
- "android/support/text/emoji/R": "androidx/emoji/R",
- "android/support/text/emoji/TypefaceEmojiSpan": "androidx/emoji/text/TypefaceEmojiSpan",
- "android/support/text/emoji/bundled/BundledEmojiCompatConfig": "androidx/emoji/bundled/BundledEmojiCompatConfig",
- "android/support/text/emoji/widget/EditTextAttributeHelper": "androidx/emoji/widget/EditTextAttributeHelper",
- "android/support/text/emoji/widget/EmojiAppCompatButton": "androidx/emoji/widget/EmojiAppCompatButton",
- "android/support/text/emoji/widget/EmojiAppCompatEditText": "androidx/emoji/widget/EmojiAppCompatEditText",
- "android/support/text/emoji/widget/EmojiAppCompatTextView": "androidx/emoji/widget/EmojiAppCompatTextView",
- "android/support/text/emoji/widget/EmojiButton": "androidx/emoji/widget/EmojiButton",
- "android/support/text/emoji/widget/EmojiEditText": "androidx/emoji/widget/EmojiEditText",
- "android/support/text/emoji/widget/EmojiEditTextHelper": "androidx/emoji/widget/EmojiEditTextHelper",
- "android/support/text/emoji/widget/EmojiEditableFactory": "androidx/emoji/widget/EmojiEditableFactory",
- "android/support/text/emoji/widget/EmojiExtractEditText": "androidx/emoji/widget/EmojiExtractEditText",
- "android/support/text/emoji/widget/EmojiExtractTextLayout": "androidx/emoji/widget/EmojiExtractTextLayout",
- "android/support/text/emoji/widget/EmojiInputConnection": "androidx/emoji/widget/EmojiInputConnection",
- "android/support/text/emoji/widget/EmojiInputFilter": "androidx/emoji/widget/EmojiInputFilter",
- "android/support/text/emoji/widget/EmojiKeyListener": "androidx/emoji/widget/EmojiKeyListener",
- "android/support/text/emoji/widget/EmojiTextView": "androidx/emoji/widget/EmojiTextView",
- "android/support/text/emoji/widget/EmojiTextViewHelper": "androidx/emoji/widget/EmojiTextViewHelper",
- "android/support/text/emoji/widget/EmojiTextWatcher": "androidx/emoji/widget/EmojiTextWatcher",
- "android/support/text/emoji/widget/EmojiTransformationMethod": "androidx/emoji/widget/EmojiTransformationMethod",
- "android/support/text/emoji/widget/ExtractButtonCompat": "androidx/emoji/widget/ExtractButtonCompat",
- "android/support/text/emoji/widget/SpannableBuilder": "androidx/emoji/widget/SpannableBuilder",
"android/support/transition/AnimatorUtils": "androidx/transition/AnimatorUtils",
"android/support/transition/ArcMotion": "androidx/transition/ArcMotion",
"android/support/transition/AutoTransition": "androidx/transition/AutoTransition",
@@ -4199,8 +4150,6 @@
"android/support/v4/view/animation/PathInterpolatorCompat": "androidx/core/view/animation/PathInterpolatorCompat",
"android/support/v4/widget/AutoScrollHelper": "androidx/core/widget/AutoScrollHelper",
"android/support/v4/widget/AutoSizeableTextView": "androidx/core/widget/AutoSizeableTextView",
- "android/support/v4/widget/CircleImageView": "androidx/swiperefreshlayout/widget/CircleImageView",
- "android/support/v4/widget/CircularProgressDrawable": "androidx/swiperefreshlayout/widget/CircularProgressDrawable",
"android/support/v4/widget/CompoundButtonCompat": "androidx/core/widget/CompoundButtonCompat",
"android/support/v4/widget/ContentLoadingProgressBar": "androidx/core/widget/ContentLoadingProgressBar",
"android/support/v4/widget/CursorAdapter": "androidx/cursoradapter/widget/CursorAdapter",
@@ -4220,9 +4169,7 @@
"android/support/v4/widget/ResourceCursorAdapter": "androidx/cursoradapter/widget/ResourceCursorAdapter",
"android/support/v4/widget/ScrollerCompat": "androidx/core/widget/ScrollerCompat",
"android/support/v4/widget/SimpleCursorAdapter": "androidx/cursoradapter/widget/SimpleCursorAdapter",
- "android/support/v4/widget/SlidingPaneLayout": "androidx/slidingpanelayout/widget/SlidingPaneLayout",
"android/support/v4/widget/Space": "androidx/legacy/widget/Space",
- "android/support/v4/widget/SwipeRefreshLayout": "androidx/swiperefreshlayout/widget/SwipeRefreshLayout",
"android/support/v4/widget/TextViewCompat": "androidx/core/widget/TextViewCompat",
"android/support/v4/widget/TintableCompoundButton": "androidx/core/widget/TintableCompoundButton",
"android/support/v4/widget/TintableImageSourceView": "androidx/core/widget/TintableImageSourceView",
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/Processor.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/Processor.kt
index 4603bf8..2907c82 100644
--- a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/Processor.kt
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/Processor.kt
@@ -23,6 +23,7 @@
import com.android.tools.build.jetifier.processor.archive.Archive
import com.android.tools.build.jetifier.processor.archive.ArchiveFile
import com.android.tools.build.jetifier.processor.archive.ArchiveItemVisitor
+import com.android.tools.build.jetifier.processor.archive.FileSearchResult
import com.android.tools.build.jetifier.processor.transform.TransformationContext
import com.android.tools.build.jetifier.processor.transform.Transformer
import com.android.tools.build.jetifier.processor.transform.bytecode.ByteCodeTransformer
@@ -33,6 +34,7 @@
import com.android.tools.build.jetifier.processor.transform.resource.XmlResourcesTransformer
import java.io.File
import java.io.FileNotFoundException
+import java.lang.StringBuilder
/**
* The main entry point to the library. Extracts any given archive recursively and runs all
@@ -41,7 +43,8 @@
*/
class Processor private constructor(
private val context: TransformationContext,
- private val transformers: List<Transformer>
+ private val transformers: List<Transformer>,
+ private val stripSignatureFiles: Boolean = false
) : ArchiveItemVisitor {
companion object {
@@ -77,14 +80,17 @@
* @param useFallbackIfTypeIsMissing Use fallback for types resolving instead of crashing
* @param allowAmbiguousPackages Whether Jetifier should not crash when it attempts to
* rewrite ambiguous package reference such as android.support.v4.
+ * @param stripSignatures Don't throw an error when jetifying a signed library and strip
+ * the signature files instead.
* @param dataBindingVersion The versions to be used for data binding otherwise undefined.
*/
- fun createProcessor2(
+ fun createProcessor3(
config: Config,
reversedMode: Boolean = false,
rewritingSupportLib: Boolean = false,
useFallbackIfTypeIsMissing: Boolean = true,
allowAmbiguousPackages: Boolean = false,
+ stripSignatures: Boolean = false,
dataBindingVersion: String? = null
): Processor {
var newConfig = config
@@ -125,7 +131,40 @@
createTransformers(context)
}
- return Processor(context, transformers)
+ return Processor(context, transformers, stripSignatures)
+ }
+
+ /**
+ * Creates a new instance of the [Processor].
+ *
+ * @param config Transformation configuration
+ * @param reversedMode Whether the processor should run in reversed mode
+ * @param rewritingSupportLib Whether we are rewriting the support library itself
+ * @param useFallbackIfTypeIsMissing Use fallback for types resolving instead of crashing
+ * @param allowAmbiguousPackages Whether Jetifier should not crash when it attempts to
+ * rewrite ambiguous package reference such as android.support.v4.
+ * @param dataBindingVersion The versions to be used for data binding otherwise undefined.
+ */
+ @Deprecated(
+ message = "Legacy method that is missing 'throwErrorIsSignatureDetected' attribute",
+ replaceWith = ReplaceWith(expression = "Processor.createProcessor3"))
+ fun createProcessor2(
+ config: Config,
+ reversedMode: Boolean = false,
+ rewritingSupportLib: Boolean = false,
+ useFallbackIfTypeIsMissing: Boolean = true,
+ allowAmbiguousPackages: Boolean = false,
+ dataBindingVersion: String? = null
+ ): Processor {
+ return createProcessor3(
+ config = config,
+ reversedMode = reversedMode,
+ rewritingSupportLib = rewritingSupportLib,
+ useFallbackIfTypeIsMissing = useFallbackIfTypeIsMissing,
+ allowAmbiguousPackages = allowAmbiguousPackages,
+ stripSignatures = false,
+ dataBindingVersion = dataBindingVersion
+ )
}
/**
@@ -138,9 +177,10 @@
* @param versionSetName Versions map for dependencies rewriting
* @param dataBindingVersion The versions to be used for data binding otherwise undefined.
*/
- @Deprecated(message = "Legacy method that is missing 'allowAmbiguousPackages' attribute " +
- "and 'versionSetName' attribute is not used anymore.",
- replaceWith = ReplaceWith(expression = "Processor.createProcessor2"))
+ @Deprecated(
+ message = "Legacy method that is missing 'allowAmbiguousPackages' attribute and " +
+ "'versionSetName' attribute is not used anymore.",
+ replaceWith = ReplaceWith(expression = "Processor.createProcessor3"))
fun createProcessor(
config: Config,
reversedMode: Boolean = false,
@@ -225,7 +265,10 @@
// 4) Transform the previously discovered POM files
transformPomFiles(pomFiles)
- // 5) Repackage the libraries back to archive files
+ // 5) Find signature files and report them if needed
+ runSignatureDetectionFor(libraries)
+
+ // 6) Repackage the libraries back to archive files
val generatedLibraries = libraries
.filter { copyUnmodifiedLibsAlso || it.wasChanged }
.map {
@@ -237,7 +280,7 @@
return generatedLibraries
}
- // 6) Create a set of files that should be removed (because they've been changed).
+ // 7) Create a set of files that should be removed (because they've been changed).
val filesToRemove = libraries
.filter { it.wasChanged }
.map { it.relativePath.toFile() }
@@ -246,6 +289,40 @@
return inputLibraries.minus(filesToRemove).plus(generatedLibraries)
}
+ private fun runSignatureDetectionFor(libraries: List<Archive>) {
+ var wereSignaturesDetected = false
+ val sb = StringBuilder()
+
+ libraries
+ .filter { it.wasChanged }
+ .forEach { library ->
+ val foundSignatures = FileSearchResult()
+ library.findAllFiles({ isSignatureFile(it) }, foundSignatures)
+ if (foundSignatures.all.isNotEmpty()) {
+ wereSignaturesDetected = true
+ sb.appendln()
+ sb.appendln("Found following signature files for '${library.relativePath}':")
+ foundSignatures.all
+ .sortedBy { it.relativePath.toString() }
+ .forEach { file ->
+ sb.appendln("- ${file.relativePath}")
+ file.markedForRemoval = true
+ }
+ }
+ }
+
+ if (wereSignaturesDetected && !stripSignatureFiles) {
+ throw SignatureFilesFoundJetifierException(
+ "Jetifier found signature in at least one of the archives that need to be " +
+ "modified. However doing so would break the signatures. Please ask the library " +
+ "owner to provide jetpack compatible signed library. If you don't need " +
+ "the signatures you can re-run jetifier with 'stripSignatures' option on. " +
+ "Jetifier will then remove all affected signature files. Below is list of all " +
+ "the signature that were discovered: $sb}"
+ )
+ }
+ }
+
/**
* Maps the given dependency (in form of groupId:artifactId:version) to a new set of
* dependencies. Used for mapping of old support library artifacts to jetpack ones.
@@ -348,7 +425,7 @@
archive.files.forEach { it.accept(this) }
// This is an ugly workaround to merge annotations files due to having old and new
- // namespaces at the same time
+ // namespaces at the same time
if (context.isInReversedMode) {
AnnotationFilesMerger.tryMergeFilesInArchive(archive)
}
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/SignatureDetection.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/SignatureDetection.kt
new file mode 100644
index 0000000..9721c11
--- /dev/null
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/SignatureDetection.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.build.jetifier.processor
+
+import com.android.tools.build.jetifier.processor.archive.ArchiveFile
+import java.nio.charset.StandardCharsets
+import java.util.regex.Pattern
+
+private val signatureFilePattern = Pattern.compile(
+ "^(/|\\\\)*meta-inf(/|\\\\)[^/\\\\]*\\.(SF|DSA|RSA|(SIG(-[^.]*)?))$",
+ Pattern.CASE_INSENSITIVE
+)
+
+private val manifestPattern = Pattern.compile(
+ "^(/|\\\\)*meta-inf(/|\\\\)manifest\\.mf$",
+ Pattern.CASE_INSENSITIVE
+)
+
+private val manifestSignatureDataPattern = Pattern.compile(
+ "(SHA1|SHA-1|SHA256|SHA-256)-Digest",
+ Pattern.CASE_INSENSITIVE
+)
+
+fun isSignatureFile(file: ArchiveFile): Boolean {
+ if (signatureFilePattern.matcher(file.relativePath.toString()).matches()) {
+ return true
+ }
+
+ if (!manifestPattern.matcher(file.relativePath.toString()).matches()) {
+ return false
+ }
+
+ val content = StringBuilder(file.data.toString(StandardCharsets.UTF_8)).toString()
+ return manifestSignatureDataPattern.matcher(content).find()
+}
+
+class SignatureFilesFoundJetifierException(message: String) : Exception(message)
\ No newline at end of file
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/Archive.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/Archive.kt
index e95f3e3..3fd5390 100644
--- a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/Archive.kt
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/Archive.kt
@@ -54,6 +54,8 @@
override val fileName: String = relativePath.fileName.toString()
+ override var markedForRemoval: Boolean = false
+
private var targetPath: Path = relativePath
override val wasChanged: Boolean
@@ -66,6 +68,10 @@
targetPath = path
}
+ override fun findAllFiles(selector: (ArchiveFile) -> Boolean, result: FileSearchResult) {
+ files.forEach { it.findAllFiles(selector, result) }
+ }
+
override fun accept(visitor: ArchiveItemVisitor) {
visitor.visit(this)
}
@@ -115,6 +121,10 @@
val out = ZipOutputStream(outputStream)
for (file in files) {
+ if (file.markedForRemoval) {
+ continue
+ }
+
Log.v(TAG, "Writing file: %s", file.relativePath)
// Make sure we always use '/' as separator in ZipOutputStream otherwise we might end
// up with a corrupted zip file on a non-Unix OS (b/109738608).
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveFile.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveFile.kt
index 06e332c..21056d0 100644
--- a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveFile.kt
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveFile.kt
@@ -34,9 +34,17 @@
override var wasChanged: Boolean = false
private set
+ override var markedForRemoval: Boolean = false
+
var data: ByteArray = data
private set
+ override fun findAllFiles(selector: (ArchiveFile) -> Boolean, result: FileSearchResult) {
+ if (selector(this)) {
+ result.addFile(this)
+ }
+ }
+
override fun accept(visitor: ArchiveItemVisitor) {
visitor.visit(this)
}
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveItem.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveItem.kt
index 9e188ca..3e772cc 100644
--- a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveItem.kt
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/archive/ArchiveItem.kt
@@ -46,6 +46,16 @@
val wasChanged: Boolean
/**
+ * Whether to exclude this item from the generated output.
+ */
+ var markedForRemoval: Boolean
+
+ /**
+ * Finds all the files satisfying the given [selector] and adds them to [result].
+ */
+ fun findAllFiles(selector: (ArchiveFile) -> Boolean, result: FileSearchResult)
+
+ /**
* Accepts visitor.
*/
fun accept(visitor: ArchiveItemVisitor)
@@ -55,12 +65,26 @@
*/
fun writeSelfTo(outputStream: OutputStream)
- fun isPomFile() = fileName.equals("pom.xml", ignoreCase = true)
- || fileName.endsWith(".pom", ignoreCase = true)
+ fun isPomFile() = fileName.equals("pom.xml", ignoreCase = true) ||
+ fileName.endsWith(".pom", ignoreCase = true)
fun isClassFile() = fileName.endsWith(".class", ignoreCase = true)
fun isXmlFile() = fileName.endsWith(".xml", ignoreCase = true)
- fun isProGuardFile () = fileName.equals("proguard.txt", ignoreCase = true)
+ fun isProGuardFile() = fileName.equals("proguard.txt", ignoreCase = true)
+}
+
+/**
+ * Aggregated result of all the files that were found.
+ *
+ * @see ArchiveItem.findAllFiles
+ */
+class FileSearchResult {
+
+ val all = mutableSetOf<ArchiveFile>()
+
+ fun addFile(file: ArchiveFile) {
+ all.add(file)
+ }
}
\ No newline at end of file
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImpl.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImpl.kt
index 6898866..24544fd 100644
--- a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImpl.kt
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImpl.kt
@@ -88,8 +88,8 @@
// Verify that we did not make an ambiguous mapping, see b/116745353
if (!context.allowAmbiguousPackages && AMBIGUOUS_STRINGS.contains(type)) {
- throw IllegalArgumentException("The given artifact contains a string literal with" +
- " a package reference '$value' that cannot be safely rewritten. Libraries " +
+ throw AmbiguousStringJetifierException("The given artifact contains a string literal " +
+ "with a package reference '$value' that cannot be safely rewritten. Libraries " +
"using reflection such as annotation processors need to be updated manually " +
"to add support for androidx.")
}
@@ -148,3 +148,8 @@
return path
}
}
+
+/**
+ * Thrown when jetifier finds a string reference to a package that has ambiguous mapping.
+ */
+class AmbiguousStringJetifierException(message: String) : Exception(message)
\ No newline at end of file
diff --git a/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/signatures/SignatureIntegrationTest.kt b/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/signatures/SignatureIntegrationTest.kt
new file mode 100644
index 0000000..588a3fd
--- /dev/null
+++ b/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/signatures/SignatureIntegrationTest.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.build.jetifier.processor.signatures
+
+import com.android.tools.build.jetifier.core.config.Config
+import com.android.tools.build.jetifier.core.config.ConfigParser
+import com.android.tools.build.jetifier.processor.FileMapping
+import com.android.tools.build.jetifier.processor.Processor
+import com.android.tools.build.jetifier.processor.SignatureFilesFoundJetifierException
+import com.android.tools.build.jetifier.processor.archive.Archive
+import com.google.common.truth.Truth
+import org.junit.Test
+import java.io.File
+
+class SignatureIntegrationTest {
+
+ private val signedLib = File(
+ javaClass.getResource("/signatureDetectionTest/signedLibrary.jar").file)
+
+ @Test
+ fun archiveWithSignature_notJetified_shouldBeOk() {
+ val processor = Processor.createProcessor3(
+ // Since we give empty config, no jetification can happen. Thus jetifier thinks that
+ // the library is not affected by it.
+ Config.fromOptional()
+ )
+
+ val toFile = File.createTempFile("signatureTestResult.jar", "test")
+
+ processor.transform(input = setOf(FileMapping(from = signedLib, to = toFile)))
+
+ // Make sure that signatures were not stripped out
+ val archive = Archive.Builder.extract(toFile)
+ val mf = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/MANIFEST.MF" }
+ val rsa = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/PFOPENSO.RSA" }
+ val sf = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/PFOPENSO.SF" }
+ Truth.assertThat(mf).isNotNull()
+ Truth.assertThat(rsa).isNotNull()
+ Truth.assertThat(sf).isNotNull()
+ }
+
+ @Test
+ fun archiveWithSignature_notJetified_stripRequired_shouldNotStrip() {
+ val processor = Processor.createProcessor3(
+ Config.fromOptional(),
+ stripSignatures = true)
+
+ val toFile = File.createTempFile("signatureTestResult.jar", "test")
+
+ processor.transform(input = setOf(FileMapping(from = signedLib, to = toFile)))
+
+ val archive = Archive.Builder.extract(toFile)
+ val mf = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/MANIFEST.MF" }
+ val rsa = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/PFOPENSO.RSA" }
+ val sf = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/PFOPENSO.SF" }
+ Truth.assertThat(mf).isNotNull()
+ Truth.assertThat(rsa).isNotNull()
+ Truth.assertThat(sf).isNotNull()
+ }
+
+ @Test(expected = SignatureFilesFoundJetifierException::class)
+ fun archiveWithSignature_andJetified_shouldThrowError() {
+ val processor = Processor.createProcessor3(
+ ConfigParser.loadDefaultConfig()!!
+ )
+
+ val toFile = File.createTempFile("signatureTestResult.jar", "test")
+
+ processor.transform(input = setOf(FileMapping(from = signedLib, to = toFile)))
+ }
+
+ @Test
+ fun archiveWithSignature_andJetified__stripRequired_shouldStrip() {
+ val processor = Processor.createProcessor3(
+ ConfigParser.loadDefaultConfig()!!,
+ stripSignatures = true
+ )
+
+ val toFile = File.createTempFile("signatureTestResult.jar", "test")
+
+ processor.transform(input = setOf(FileMapping(from = signedLib, to = toFile)))
+
+ val archive = Archive.Builder.extract(toFile)
+ val mf = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/MANIFEST.MF" }
+ val rsa = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/PFOPENSO.RSA" }
+ val sf = archive.files.firstOrNull {
+ it.relativePath.toString() == "META-INF/PFOPENSO.SF" }
+ Truth.assertThat(mf).isNull()
+ Truth.assertThat(rsa).isNull()
+ Truth.assertThat(sf).isNull()
+ }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/signatures/SignaturePathCheckTest.kt b/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/signatures/SignaturePathCheckTest.kt
new file mode 100644
index 0000000..323b80b7
--- /dev/null
+++ b/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/signatures/SignaturePathCheckTest.kt
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.build.jetifier.processor.signatures
+
+import com.android.tools.build.jetifier.processor.archive.ArchiveFile
+import com.android.tools.build.jetifier.processor.isSignatureFile
+import com.google.common.truth.Truth
+import org.junit.Test
+import java.nio.file.Paths
+
+class SignaturePathCheckTest {
+
+ @Test
+ fun signatureFilePath_SF() {
+ Truth.assertThat(checkSignatureFor("meta-inf/hello.sf")).isTrue()
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.sf")).isTrue()
+ Truth.assertThat(checkSignatureFor("/META-INF/HELLO.SF")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_DSA() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.dsa")).isTrue()
+ Truth.assertThat(checkSignatureFor("/META-INF/HELLO.DSA")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_RSA() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.rsa")).isTrue()
+ Truth.assertThat(checkSignatureFor("/META-INF/HELLO.RSA")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_SIG() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.sig")).isTrue()
+ Truth.assertThat(checkSignatureFor("/META-INF/HELLO.SIG")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_SIG123() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.sig-123")).isTrue()
+ Truth.assertThat(checkSignatureFor("/META-INF/HELLO.SIG-123")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_sf_notUnix() {
+ Truth.assertThat(checkSignatureFor("\\meta-inf\\hello.sf")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_DSA_notUnix() {
+ Truth.assertThat(checkSignatureFor("\\meta-inf\\hello.DSA")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_RSA_notUnix() {
+ Truth.assertThat(checkSignatureFor("\\meta-inf\\hello.RSA")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_SIG_notUnix() {
+ Truth.assertThat(checkSignatureFor("\\meta-inf\\hello.SIG-123")).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_SF_notInMetaInf() {
+ Truth.assertThat(checkSignatureFor("/not-meta-inf/hello.SF")).isFalse()
+ Truth.assertThat(checkSignatureFor("/meta-inf/old/hello.SF")).isFalse()
+ Truth.assertThat(checkSignatureFor("/old/meta-inf/hello.SF")).isFalse()
+ Truth.assertThat(checkSignatureFor("old/meta-inf/hello.SF")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_DSA_notInMetaInf() {
+ Truth.assertThat(checkSignatureFor("/not-meta-inf/hello.DSA")).isFalse()
+ Truth.assertThat(checkSignatureFor("/meta-inf/old/hello.DSA")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_RSA_notInMetaInf() {
+ Truth.assertThat(checkSignatureFor("/not-meta-inf/hello.RSA")).isFalse()
+ Truth.assertThat(checkSignatureFor("/meta-inf/old/hello.RSA")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_SIG_notInMetaInf() {
+ Truth.assertThat(checkSignatureFor("/not-meta-inf/hello.SIG-1")).isFalse()
+ Truth.assertThat(checkSignatureFor("/meta-inf/old/hello.SIG-1")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_SF_onlySubstring() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.SF.nope")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_DSA_onlySubstring() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.DSA.nope")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_RSA_onlySubstring() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.RSA.nope")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_SIG_onlySubstring() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/hello.SIG.nope")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_manifestFile_empty() {
+ Truth.assertThat(checkSignatureFor("/meta-inf/manifest.mf")).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_manifestFile_notRelated() {
+ Truth.assertThat(
+ checkSignatureFor(
+ "/meta-inf/manifest.mf",
+ "Hello world!".toByteArray())
+ ).isFalse()
+ }
+
+ @Test
+ fun signatureFilePath_manifestFile_containingSignature() {
+ Truth.assertThat(
+ checkSignatureFor(
+ "/meta-inf/manifest.mf",
+ "SHA1-Digest: (base64 representation of SHA1 digest)".toByteArray())
+ ).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_manifestFile_containingSignature2() {
+ Truth.assertThat(
+ checkSignatureFor(
+ "/meta-inf/manifest.mf",
+ "SHA-256-Digest: (base64 representation of SHA-256 digest)".toByteArray())
+ ).isTrue()
+ }
+
+ @Test
+ fun signatureFilePath_manifestFile_notInPath_containingSignature() {
+ Truth.assertThat(
+ checkSignatureFor(
+ "/not-meta-inf/manifest.mf",
+ "SHA1-Digest: (base64 representation of SHA1 digest)".toByteArray())
+ ).isFalse()
+ }
+
+ private fun checkSignatureFor(path: String, content: ByteArray = byteArrayOf()): Boolean {
+ return isSignatureFile(
+ ArchiveFile(
+ relativePath = Paths.get(path),
+ data = content
+ )
+ )
+ }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImplTest.kt b/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImplTest.kt
index 5560c0a..8ee7e2b 100644
--- a/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImplTest.kt
+++ b/jetifier/jetifier/processor/src/test/kotlin/com/android/tools/build/jetifier/processor/transform/bytecode/CoreRemapperImplTest.kt
@@ -41,7 +41,7 @@
Truth.assertThat(remapper.rewriteString(given)).isEqualTo(expected)
}
- @Test(expected = IllegalArgumentException::class)
+ @Test(expected = AmbiguousStringJetifierException::class)
fun remapString_ambiguousPackageGiven_throwsException() {
val remapper = prepareRemapper(
TypesMap.EMPTY,
diff --git a/jetifier/jetifier/processor/src/test/resources/signatureDetectionTest/signedLibrary.jar b/jetifier/jetifier/processor/src/test/resources/signatureDetectionTest/signedLibrary.jar
new file mode 100644
index 0000000..7ba5d80
--- /dev/null
+++ b/jetifier/jetifier/processor/src/test/resources/signatureDetectionTest/signedLibrary.jar
Binary files differ
diff --git a/jetifier/jetifier/standalone/src/main/kotlin/com/android/tools/build/jetifier/standalone/Main.kt b/jetifier/jetifier/standalone/src/main/kotlin/com/android/tools/build/jetifier/standalone/Main.kt
index 3254802..e0b3cb6 100644
--- a/jetifier/jetifier/standalone/src/main/kotlin/com/android/tools/build/jetifier/standalone/Main.kt
+++ b/jetifier/jetifier/standalone/src/main/kotlin/com/android/tools/build/jetifier/standalone/Main.kt
@@ -83,6 +83,14 @@
hasArgs = false,
isRequired = false
)
+ val OPTION_STRIP_SIGNATURES = createOption(
+ argName = "stripSignatures",
+ argNameLong = "stripSignatures",
+ desc = "Don't throw an error when jetifying a signed library and instead strip " +
+ "the signature files.",
+ hasArgs = false,
+ isRequired = false
+ )
private fun createOption(
argName: String,
@@ -138,11 +146,13 @@
val isReversed = cmd.hasOption(OPTION_REVERSED.opt)
val isStrict = cmd.hasOption(OPTION_STRICT.opt)
+ val shouldStripSignatures = cmd.hasOption(OPTION_STRIP_SIGNATURES.opt)
- val processor = Processor.createProcessor2(
+ val processor = Processor.createProcessor3(
config = config,
reversedMode = isReversed,
rewritingSupportLib = rebuildTopOfTree,
+ stripSignatures = shouldStripSignatures,
useFallbackIfTypeIsMissing = !isStrict)
processor.transform(fileMappings)
diff --git a/leanback-preference/api/1.1.0-alpha02.txt b/leanback-preference/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..5d40456
--- /dev/null
+++ b/leanback-preference/api/1.1.0-alpha02.txt
@@ -0,0 +1,107 @@
+// Signature format: 3.0
+package androidx.leanback.preference {
+
+ @Deprecated public abstract class BaseLeanbackPreferenceFragment extends androidx.preference.PreferenceFragment {
+ ctor @Deprecated public BaseLeanbackPreferenceFragment();
+ method @Deprecated public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ }
+
+ public abstract class BaseLeanbackPreferenceFragmentCompat extends androidx.preference.PreferenceFragmentCompat {
+ ctor public BaseLeanbackPreferenceFragmentCompat();
+ }
+
+ public class LeanbackEditTextPreferenceDialogFragmentCompat extends androidx.leanback.preference.LeanbackPreferenceDialogFragmentCompat {
+ ctor public LeanbackEditTextPreferenceDialogFragmentCompat();
+ method public static androidx.leanback.preference.LeanbackEditTextPreferenceDialogFragmentCompat! newInstance(String!);
+ field public static final String EXTRA_IME_OPTIONS = "ime_option";
+ field public static final String EXTRA_INPUT_TYPE = "input_type";
+ }
+
+ @Deprecated public class LeanbackListPreferenceDialogFragment extends androidx.leanback.preference.LeanbackPreferenceDialogFragment {
+ ctor @Deprecated public LeanbackListPreferenceDialogFragment();
+ method @Deprecated public static androidx.leanback.preference.LeanbackListPreferenceDialogFragment! newInstanceMulti(String!);
+ method @Deprecated public static androidx.leanback.preference.LeanbackListPreferenceDialogFragment! newInstanceSingle(String!);
+ method @Deprecated public androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter();
+ }
+
+ @Deprecated public class LeanbackListPreferenceDialogFragment.AdapterMulti extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder> implements androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+ ctor @Deprecated public LeanbackListPreferenceDialogFragment.AdapterMulti(CharSequence[]!, CharSequence[]!, java.util.Set<java.lang.String>!);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void onBindViewHolder(androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder!, int);
+ method @Deprecated public androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
+ method @Deprecated public void onItemClick(androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder!);
+ }
+
+ @Deprecated public class LeanbackListPreferenceDialogFragment.AdapterSingle extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder> implements androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+ ctor @Deprecated public LeanbackListPreferenceDialogFragment.AdapterSingle(CharSequence[]!, CharSequence[]!, CharSequence!);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void onBindViewHolder(androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder!, int);
+ method @Deprecated public androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
+ method @Deprecated public void onItemClick(androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder!);
+ }
+
+ @Deprecated public static class LeanbackListPreferenceDialogFragment.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
+ ctor @Deprecated public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
+ method @Deprecated public android.view.ViewGroup! getContainer();
+ method @Deprecated public android.widget.TextView! getTitleView();
+ method @Deprecated public android.widget.Checkable! getWidgetView();
+ method @Deprecated public void onClick(android.view.View!);
+ }
+
+ @Deprecated public static interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+ method @Deprecated public void onItemClick(androidx.leanback.preference.LeanbackListPreferenceDialogFragment.ViewHolder!);
+ }
+
+ public class LeanbackListPreferenceDialogFragmentCompat extends androidx.leanback.preference.LeanbackPreferenceDialogFragmentCompat {
+ ctor public LeanbackListPreferenceDialogFragmentCompat();
+ method public static androidx.leanback.preference.LeanbackListPreferenceDialogFragmentCompat! newInstanceMulti(String!);
+ method public static androidx.leanback.preference.LeanbackListPreferenceDialogFragmentCompat! newInstanceSingle(String!);
+ }
+
+ public static final class LeanbackListPreferenceDialogFragmentCompat.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
+ method public android.view.ViewGroup! getContainer();
+ method public android.widget.TextView! getTitleView();
+ method public android.widget.Checkable! getWidgetView();
+ method public void onClick(android.view.View!);
+ }
+
+ @Deprecated public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
+ ctor @Deprecated public LeanbackPreferenceDialogFragment();
+ method @Deprecated public androidx.preference.DialogPreference! getPreference();
+ field @Deprecated public static final String ARG_KEY = "key";
+ }
+
+ public class LeanbackPreferenceDialogFragmentCompat extends androidx.fragment.app.Fragment {
+ ctor public LeanbackPreferenceDialogFragmentCompat();
+ method public androidx.preference.DialogPreference! getPreference();
+ field public static final String ARG_KEY = "key";
+ }
+
+ @Deprecated public abstract class LeanbackPreferenceFragment extends androidx.leanback.preference.BaseLeanbackPreferenceFragment {
+ ctor @Deprecated public LeanbackPreferenceFragment();
+ method @Deprecated public void setTitle(CharSequence!);
+ }
+
+ public abstract class LeanbackPreferenceFragmentCompat extends androidx.leanback.preference.BaseLeanbackPreferenceFragmentCompat {
+ ctor public LeanbackPreferenceFragmentCompat();
+ method public void setTitle(CharSequence!);
+ }
+
+ @Deprecated public abstract class LeanbackSettingsFragment extends android.app.Fragment implements androidx.preference.PreferenceFragment.OnPreferenceDisplayDialogCallback androidx.preference.PreferenceFragment.OnPreferenceStartFragmentCallback androidx.preference.PreferenceFragment.OnPreferenceStartScreenCallback {
+ ctor @Deprecated public LeanbackSettingsFragment();
+ method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference!);
+ method @Deprecated public abstract void onPreferenceStartInitialScreen();
+ method @Deprecated public void startImmersiveFragment(android.app.Fragment);
+ method @Deprecated public void startPreferenceFragment(android.app.Fragment);
+ }
+
+ public abstract class LeanbackSettingsFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback androidx.preference.PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+ ctor public LeanbackSettingsFragmentCompat();
+ method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference!);
+ method public abstract void onPreferenceStartInitialScreen();
+ method public void startImmersiveFragment(androidx.fragment.app.Fragment);
+ method public void startPreferenceFragment(androidx.fragment.app.Fragment);
+ }
+
+}
+
diff --git a/leanback-preference/api/current.txt b/leanback-preference/api/current.txt
index 79e53fb..5d40456 100644
--- a/leanback-preference/api/current.txt
+++ b/leanback-preference/api/current.txt
@@ -3,6 +3,7 @@
@Deprecated public abstract class BaseLeanbackPreferenceFragment extends androidx.preference.PreferenceFragment {
ctor @Deprecated public BaseLeanbackPreferenceFragment();
+ method @Deprecated public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
}
public abstract class BaseLeanbackPreferenceFragmentCompat extends androidx.preference.PreferenceFragmentCompat {
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/leanback-preference/api/res-1.1.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to leanback-preference/api/res-1.1.0-alpha02.txt
diff --git a/leanback-preference/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java b/leanback-preference/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
index 7167c18..0838b1a 100644
--- a/leanback-preference/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
+++ b/leanback-preference/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
@@ -16,7 +16,7 @@
package androidx.leanback.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Fragment;
import android.transition.Transition;
@@ -29,9 +29,8 @@
/**
* @hide
*/
-@SuppressWarnings("RestrictedApi")
@RequiresApi(21)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class LeanbackPreferenceFragmentTransitionHelperApi21 {
public static void addTransitions(Fragment f) {
diff --git a/leanback-preference/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java b/leanback-preference/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java
index 8d7e477..3f9a766 100644
--- a/leanback-preference/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java
+++ b/leanback-preference/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java
@@ -16,7 +16,7 @@
package androidx.leanback.preference.internal;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Outline;
@@ -35,7 +35,7 @@
* @hide
*/
@RequiresApi(21)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class OutlineOnlyWithChildrenFrameLayout extends FrameLayout {
private ViewOutlineProvider mMagicalOutlineProvider;
diff --git a/leanback-preference/build.gradle b/leanback-preference/build.gradle
index d0fc83a..e14e08c 100644
--- a/leanback-preference/build.gradle
+++ b/leanback-preference/build.gradle
@@ -6,11 +6,12 @@
}
dependencies {
+ api(project(":annotation"))
implementation("androidx.collection:collection:1.0.0")
api("androidx.appcompat:appcompat:1.0.0")
api("androidx.recyclerview:recyclerview:1.0.0")
- api("androidx.preference:preference:1.0.0")
- api("androidx.leanback:leanback:1.0.0")
+ api(project(":preference"))
+ api(project(":leanback"))
}
android {
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java
index fd3abd6..56c9965 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java
@@ -16,7 +16,7 @@
package androidx.leanback.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Fragment;
import android.os.Bundle;
@@ -37,7 +37,6 @@
@Deprecated
public abstract class BaseLeanbackPreferenceFragment extends PreferenceFragment {
- @SuppressWarnings("RestrictedApi")
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
@@ -53,7 +52,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public Fragment getCallbackFragment() {
return getParentFragment();
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragmentCompat.java b/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragmentCompat.java
index c1ef639..c853b55 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragmentCompat.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragmentCompat.java
@@ -16,7 +16,7 @@
package androidx.leanback.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -35,7 +35,6 @@
*/
public abstract class BaseLeanbackPreferenceFragmentCompat extends PreferenceFragmentCompat {
- @SuppressWarnings("RestrictedApi")
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
@@ -51,7 +50,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public Fragment getCallbackFragment() {
return getParentFragment();
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java
index e626a54..dab0ca3 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java
@@ -147,7 +147,6 @@
}
}
- @SuppressWarnings("RestrictedApi")
@Override
public @Nullable View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragmentCompat.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragmentCompat.java
index aef2bf0..9f4ed67 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragmentCompat.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragmentCompat.java
@@ -156,7 +156,6 @@
}
}
- @SuppressWarnings("RestrictedApi")
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java
index 78c282b..e2e4980 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java
@@ -32,15 +32,12 @@
* <p>The following sample code shows a simple leanback preference fragment that is
* populated from a resource. The resource it loads is:</p>
*
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
- * preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml preferences}
*
* <p>The fragment needs only to implement {@link #onCreatePreferences(Bundle, String)} to populate
* the list of preference objects:</p>
*
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
- * support_fragment_leanback}
- * support_fragment_leanback}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/androidx/preference/LeanbackPreferences.java leanback_preferences}
*/
public abstract class LeanbackPreferenceFragmentCompat extends
BaseLeanbackPreferenceFragmentCompat {
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java
index 3fc03c6..54ae388 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java
@@ -16,7 +16,7 @@
package androidx.leanback.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Fragment;
import android.app.FragmentTransaction;
@@ -196,7 +196,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class DummyFragment extends Fragment {
@Override
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragmentCompat.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragmentCompat.java
index 9f34a33..69e00b0 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragmentCompat.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragmentCompat.java
@@ -39,8 +39,7 @@
* <p>The following sample code shows a simple leanback preference fragment that is
* populated from a resource. The resource it loads is:</p>
*
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
- * preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml preferences}
*
* <p>The sample implements
* {@link PreferenceFragmentCompat.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(
@@ -49,8 +48,7 @@
* PreferenceFragmentCompat, PreferenceScreen)},
* and {@link #onPreferenceStartInitialScreen()}:</p>
*
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
- * support_fragment_leanback}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/androidx/preference/LeanbackPreferences.java leanback_preferences}
*/
public abstract class LeanbackSettingsFragmentCompat extends Fragment
implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,
diff --git a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java
index db56481..4747412 100644
--- a/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java
+++ b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java
@@ -16,7 +16,7 @@
package androidx.leanback.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -29,7 +29,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class LeanbackSettingsRootView extends FrameLayout {
private OnKeyListener mOnBackKeyListener;
diff --git a/leanback/api/1.1.0-alpha02.txt b/leanback/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..9dab078
--- /dev/null
+++ b/leanback/api/1.1.0-alpha02.txt
@@ -0,0 +1,3191 @@
+// Signature format: 3.0
+package androidx.leanback.app {
+
+ public final class BackgroundManager {
+ method public void attach(android.view.Window!);
+ method public void attachToView(android.view.View!);
+ method public void clearDrawable();
+ method @ColorInt public int getColor();
+ method @Deprecated public android.graphics.drawable.Drawable! getDefaultDimLayer();
+ method @Deprecated public android.graphics.drawable.Drawable! getDimLayer();
+ method public android.graphics.drawable.Drawable! getDrawable();
+ method public static androidx.leanback.app.BackgroundManager! getInstance(android.app.Activity!);
+ method public boolean isAttached();
+ method public boolean isAutoReleaseOnStop();
+ method public void release();
+ method public void setAutoReleaseOnStop(boolean);
+ method public void setBitmap(android.graphics.Bitmap!);
+ method public void setColor(@ColorInt int);
+ method @Deprecated public void setDimLayer(android.graphics.drawable.Drawable!);
+ method public void setDrawable(android.graphics.drawable.Drawable!);
+ method public void setThemeDrawableResourceId(int);
+ }
+
+ @Deprecated public class BaseFragment extends androidx.leanback.app.BrandedFragment {
+ method @Deprecated protected Object! createEntranceTransition();
+ method @Deprecated public final androidx.leanback.app.ProgressBarManager! getProgressBarManager();
+ method @Deprecated protected void onEntranceTransitionEnd();
+ method @Deprecated protected void onEntranceTransitionPrepare();
+ method @Deprecated protected void onEntranceTransitionStart();
+ method @Deprecated public void prepareEntranceTransition();
+ method @Deprecated protected void runEntranceTransition(Object!);
+ method @Deprecated public void startEntranceTransition();
+ }
+
+ public class BaseSupportFragment extends androidx.leanback.app.BrandedSupportFragment {
+ method protected Object! createEntranceTransition();
+ method public final androidx.leanback.app.ProgressBarManager! getProgressBarManager();
+ method protected void onEntranceTransitionEnd();
+ method protected void onEntranceTransitionPrepare();
+ method protected void onEntranceTransitionStart();
+ method public void prepareEntranceTransition();
+ method protected void runEntranceTransition(Object!);
+ method public void startEntranceTransition();
+ }
+
+ @Deprecated public class BrandedFragment extends android.app.Fragment {
+ ctor @Deprecated public BrandedFragment();
+ method @Deprecated public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method @Deprecated public int getSearchAffordanceColor();
+ method @Deprecated public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
+ method @Deprecated public CharSequence! getTitle();
+ method @Deprecated public android.view.View! getTitleView();
+ method @Deprecated public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
+ method @Deprecated public void installTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method @Deprecated public final boolean isShowingTitle();
+ method @Deprecated public android.view.View! onInflateTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method @Deprecated public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method @Deprecated public void setOnSearchClickedListener(android.view.View.OnClickListener!);
+ method @Deprecated public void setSearchAffordanceColor(int);
+ method @Deprecated public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method @Deprecated public void setTitle(CharSequence!);
+ method @Deprecated public void setTitleView(android.view.View!);
+ method @Deprecated public void showTitle(boolean);
+ method @Deprecated public void showTitle(int);
+ }
+
+ public class BrandedSupportFragment extends androidx.fragment.app.Fragment {
+ ctor public BrandedSupportFragment();
+ method public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method public int getSearchAffordanceColor();
+ method public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
+ method public CharSequence! getTitle();
+ method public android.view.View! getTitleView();
+ method public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
+ method public void installTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method public final boolean isShowingTitle();
+ method public android.view.View! onInflateTitleView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method public void setOnSearchClickedListener(android.view.View.OnClickListener!);
+ method public void setSearchAffordanceColor(int);
+ method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setTitle(CharSequence!);
+ method public void setTitleView(android.view.View!);
+ method public void showTitle(boolean);
+ method public void showTitle(int);
+ }
+
+ @Deprecated public class BrowseFragment extends androidx.leanback.app.BaseFragment {
+ method @Deprecated public static android.os.Bundle! createArgs(android.os.Bundle!, String!, int);
+ method @Deprecated public void enableMainFragmentScaling(boolean);
+ method @Deprecated public void enableRowScaling(boolean);
+ method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @Deprecated @ColorInt public int getBrandColor();
+ method @Deprecated public androidx.leanback.app.HeadersFragment! getHeadersFragment();
+ method @Deprecated public int getHeadersState();
+ method @Deprecated public android.app.Fragment! getMainFragment();
+ method @Deprecated public final androidx.leanback.app.BrowseFragment.MainFragmentAdapterRegistry! getMainFragmentRegistry();
+ method @Deprecated public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
+ method @Deprecated public androidx.leanback.widget.OnItemViewSelectedListener! getOnItemViewSelectedListener();
+ method @Deprecated public androidx.leanback.app.RowsFragment! getRowsFragment();
+ method @Deprecated public int getSelectedPosition();
+ method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! getSelectedRowViewHolder();
+ method @Deprecated public final boolean isHeadersTransitionOnBackEnabled();
+ method @Deprecated public boolean isInHeadersTransition();
+ method @Deprecated public boolean isShowingHeaders();
+ method @Deprecated public androidx.leanback.app.HeadersFragment! onCreateHeadersFragment();
+ method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setBrandColor(@ColorInt int);
+ method @Deprecated public void setBrowseTransitionListener(androidx.leanback.app.BrowseFragment.BrowseTransitionListener!);
+ method @Deprecated public void setHeaderPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method @Deprecated public void setHeadersState(int);
+ method @Deprecated public final void setHeadersTransitionOnBackEnabled(boolean);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method @Deprecated public void setSelectedPosition(int);
+ method @Deprecated public void setSelectedPosition(int, boolean);
+ method @Deprecated public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method @Deprecated public void startHeadersTransition(boolean);
+ field @Deprecated public static final int HEADERS_DISABLED = 3; // 0x3
+ field @Deprecated public static final int HEADERS_ENABLED = 1; // 0x1
+ field @Deprecated public static final int HEADERS_HIDDEN = 2; // 0x2
+ }
+
+ @Deprecated public static class BrowseFragment.BrowseTransitionListener {
+ ctor @Deprecated public BrowseFragment.BrowseTransitionListener();
+ method @Deprecated public void onHeadersTransitionStart(boolean);
+ method @Deprecated public void onHeadersTransitionStop(boolean);
+ }
+
+ @Deprecated public abstract static class BrowseFragment.FragmentFactory<T extends android.app.Fragment> {
+ ctor @Deprecated public BrowseFragment.FragmentFactory();
+ method @Deprecated public abstract T! createFragment(Object!);
+ }
+
+ @Deprecated public static interface BrowseFragment.FragmentHost {
+ method @Deprecated public void notifyDataReady(androidx.leanback.app.BrowseFragment.MainFragmentAdapter!);
+ method @Deprecated public void notifyViewCreated(androidx.leanback.app.BrowseFragment.MainFragmentAdapter!);
+ method @Deprecated public void showTitleView(boolean);
+ }
+
+ @Deprecated public static class BrowseFragment.ListRowFragmentFactory extends androidx.leanback.app.BrowseFragment.FragmentFactory<androidx.leanback.app.RowsFragment> {
+ ctor @Deprecated public BrowseFragment.ListRowFragmentFactory();
+ method @Deprecated public androidx.leanback.app.RowsFragment! createFragment(Object!);
+ }
+
+ @Deprecated public static class BrowseFragment.MainFragmentAdapter<T extends android.app.Fragment> {
+ ctor @Deprecated public BrowseFragment.MainFragmentAdapter(T!);
+ method @Deprecated public final T! getFragment();
+ method @Deprecated public final androidx.leanback.app.BrowseFragment.FragmentHost! getFragmentHost();
+ method @Deprecated public boolean isScalingEnabled();
+ method @Deprecated public boolean isScrolling();
+ method @Deprecated public void onTransitionEnd();
+ method @Deprecated public boolean onTransitionPrepare();
+ method @Deprecated public void onTransitionStart();
+ method @Deprecated public void setAlignment(int);
+ method @Deprecated public void setEntranceTransitionState(boolean);
+ method @Deprecated public void setExpand(boolean);
+ method @Deprecated public void setScalingEnabled(boolean);
+ }
+
+ @Deprecated public static interface BrowseFragment.MainFragmentAdapterProvider {
+ method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentAdapter! getMainFragmentAdapter();
+ }
+
+ @Deprecated public static final class BrowseFragment.MainFragmentAdapterRegistry {
+ ctor @Deprecated public BrowseFragment.MainFragmentAdapterRegistry();
+ method @Deprecated public android.app.Fragment! createFragment(Object!);
+ method @Deprecated public void registerFragment(Class!, androidx.leanback.app.BrowseFragment.FragmentFactory!);
+ }
+
+ @Deprecated public static class BrowseFragment.MainFragmentRowsAdapter<T extends android.app.Fragment> {
+ ctor @Deprecated public BrowseFragment.MainFragmentRowsAdapter(T!);
+ method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
+ method @Deprecated public final T! getFragment();
+ method @Deprecated public int getSelectedPosition();
+ method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method @Deprecated public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method @Deprecated public void setSelectedPosition(int, boolean);
+ }
+
+ @Deprecated public static interface BrowseFragment.MainFragmentRowsAdapterProvider {
+ method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
+ }
+
+ public class BrowseSupportFragment extends androidx.leanback.app.BaseSupportFragment {
+ method public static android.os.Bundle! createArgs(android.os.Bundle!, String!, int);
+ method public void enableMainFragmentScaling(boolean);
+ method @Deprecated public void enableRowScaling(boolean);
+ method public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @ColorInt public int getBrandColor();
+ method public int getHeadersState();
+ method public androidx.leanback.app.HeadersSupportFragment! getHeadersSupportFragment();
+ method public androidx.fragment.app.Fragment! getMainFragment();
+ method public final androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry! getMainFragmentRegistry();
+ method public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
+ method public androidx.leanback.widget.OnItemViewSelectedListener! getOnItemViewSelectedListener();
+ method public androidx.leanback.app.RowsSupportFragment! getRowsSupportFragment();
+ method public int getSelectedPosition();
+ method public androidx.leanback.widget.RowPresenter.ViewHolder! getSelectedRowViewHolder();
+ method public final boolean isHeadersTransitionOnBackEnabled();
+ method public boolean isInHeadersTransition();
+ method public boolean isShowingHeaders();
+ method public androidx.leanback.app.HeadersSupportFragment! onCreateHeadersSupportFragment();
+ method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setBrandColor(@ColorInt int);
+ method public void setBrowseTransitionListener(androidx.leanback.app.BrowseSupportFragment.BrowseTransitionListener!);
+ method public void setHeaderPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method public void setHeadersState(int);
+ method public final void setHeadersTransitionOnBackEnabled(boolean);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ method public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method public void startHeadersTransition(boolean);
+ field public static final int HEADERS_DISABLED = 3; // 0x3
+ field public static final int HEADERS_ENABLED = 1; // 0x1
+ field public static final int HEADERS_HIDDEN = 2; // 0x2
+ }
+
+ public static class BrowseSupportFragment.BrowseTransitionListener {
+ ctor public BrowseSupportFragment.BrowseTransitionListener();
+ method public void onHeadersTransitionStart(boolean);
+ method public void onHeadersTransitionStop(boolean);
+ }
+
+ public abstract static class BrowseSupportFragment.FragmentFactory<T extends androidx.fragment.app.Fragment> {
+ ctor public BrowseSupportFragment.FragmentFactory();
+ method public abstract T! createFragment(Object!);
+ }
+
+ public static interface BrowseSupportFragment.FragmentHost {
+ method public void notifyDataReady(androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter!);
+ method public void notifyViewCreated(androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter!);
+ method public void showTitleView(boolean);
+ }
+
+ public static class BrowseSupportFragment.ListRowFragmentFactory extends androidx.leanback.app.BrowseSupportFragment.FragmentFactory<androidx.leanback.app.RowsSupportFragment> {
+ ctor public BrowseSupportFragment.ListRowFragmentFactory();
+ method public androidx.leanback.app.RowsSupportFragment! createFragment(Object!);
+ }
+
+ public static class BrowseSupportFragment.MainFragmentAdapter<T extends androidx.fragment.app.Fragment> {
+ ctor public BrowseSupportFragment.MainFragmentAdapter(T!);
+ method public final T! getFragment();
+ method public final androidx.leanback.app.BrowseSupportFragment.FragmentHost! getFragmentHost();
+ method public boolean isScalingEnabled();
+ method public boolean isScrolling();
+ method public void onTransitionEnd();
+ method public boolean onTransitionPrepare();
+ method public void onTransitionStart();
+ method public void setAlignment(int);
+ method public void setEntranceTransitionState(boolean);
+ method public void setExpand(boolean);
+ method public void setScalingEnabled(boolean);
+ }
+
+ public static interface BrowseSupportFragment.MainFragmentAdapterProvider {
+ method public androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter! getMainFragmentAdapter();
+ }
+
+ public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
+ ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
+ method public androidx.fragment.app.Fragment! createFragment(Object!);
+ method public void registerFragment(Class!, androidx.leanback.app.BrowseSupportFragment.FragmentFactory!);
+ }
+
+ public static class BrowseSupportFragment.MainFragmentRowsAdapter<T extends androidx.fragment.app.Fragment> {
+ ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T!);
+ method public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
+ method public final T! getFragment();
+ method public int getSelectedPosition();
+ method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method public void setSelectedPosition(int, boolean);
+ }
+
+ public static interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+ method public androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
+ }
+
+ @Deprecated public class DetailsFragment extends androidx.leanback.app.BaseFragment {
+ method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @Deprecated public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
+ method @Deprecated public androidx.leanback.widget.DetailsParallax! getParallax();
+ method @Deprecated public androidx.leanback.app.RowsFragment! getRowsFragment();
+ method @Deprecated protected android.view.View! inflateTitle(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method @Deprecated protected void onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, int, int);
+ method @Deprecated protected void onSetRowStatus(androidx.leanback.widget.RowPresenter!, androidx.leanback.widget.RowPresenter.ViewHolder!, int, int, int);
+ method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method @Deprecated public void setSelectedPosition(int);
+ method @Deprecated public void setSelectedPosition(int, boolean);
+ method @Deprecated protected void setupDetailsOverviewRowPresenter(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!);
+ method @Deprecated protected void setupPresenter(androidx.leanback.widget.Presenter!);
+ }
+
+ @Deprecated public class DetailsFragmentBackgroundController {
+ ctor @Deprecated public DetailsFragmentBackgroundController(androidx.leanback.app.DetailsFragment!);
+ method @Deprecated public boolean canNavigateToVideoFragment();
+ method @Deprecated public void enableParallax();
+ method @Deprecated public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, androidx.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget?);
+ method @Deprecated public final android.app.Fragment! findOrCreateVideoFragment();
+ method @Deprecated public final android.graphics.drawable.Drawable! getBottomDrawable();
+ method @Deprecated public final android.graphics.Bitmap! getCoverBitmap();
+ method @Deprecated public final android.graphics.drawable.Drawable! getCoverDrawable();
+ method @Deprecated public final int getParallaxDrawableMaxOffset();
+ method @Deprecated public final androidx.leanback.media.PlaybackGlue! getPlaybackGlue();
+ method @Deprecated @ColorInt public final int getSolidColor();
+ method @Deprecated public androidx.leanback.media.PlaybackGlueHost! onCreateGlueHost();
+ method @Deprecated public android.app.Fragment! onCreateVideoFragment();
+ method @Deprecated public final void setCoverBitmap(android.graphics.Bitmap!);
+ method @Deprecated public final void setParallaxDrawableMaxOffset(int);
+ method @Deprecated public final void setSolidColor(@ColorInt int);
+ method @Deprecated public void setupVideoPlayback(androidx.leanback.media.PlaybackGlue);
+ method @Deprecated public final void switchToRows();
+ method @Deprecated public final void switchToVideo();
+ }
+
+ public class DetailsSupportFragment extends androidx.leanback.app.BaseSupportFragment {
+ method public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
+ method public androidx.leanback.widget.DetailsParallax! getParallax();
+ method public androidx.leanback.app.RowsSupportFragment! getRowsSupportFragment();
+ method @Deprecated protected android.view.View! inflateTitle(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method protected void onSetDetailsOverviewRowStatus(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, int, int);
+ method protected void onSetRowStatus(androidx.leanback.widget.RowPresenter!, androidx.leanback.widget.RowPresenter.ViewHolder!, int, int, int);
+ method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ method protected void setupDetailsOverviewRowPresenter(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!);
+ method protected void setupPresenter(androidx.leanback.widget.Presenter!);
+ }
+
+ public class DetailsSupportFragmentBackgroundController {
+ ctor public DetailsSupportFragmentBackgroundController(androidx.leanback.app.DetailsSupportFragment!);
+ method public boolean canNavigateToVideoSupportFragment();
+ method public void enableParallax();
+ method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, androidx.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget?);
+ method public final androidx.fragment.app.Fragment! findOrCreateVideoSupportFragment();
+ method public final android.graphics.drawable.Drawable! getBottomDrawable();
+ method public final android.graphics.Bitmap! getCoverBitmap();
+ method public final android.graphics.drawable.Drawable! getCoverDrawable();
+ method public final int getParallaxDrawableMaxOffset();
+ method public final androidx.leanback.media.PlaybackGlue! getPlaybackGlue();
+ method @ColorInt public final int getSolidColor();
+ method public androidx.leanback.media.PlaybackGlueHost! onCreateGlueHost();
+ method public androidx.fragment.app.Fragment! onCreateVideoSupportFragment();
+ method public final void setCoverBitmap(android.graphics.Bitmap!);
+ method public final void setParallaxDrawableMaxOffset(int);
+ method public final void setSolidColor(@ColorInt int);
+ method public void setupVideoPlayback(androidx.leanback.media.PlaybackGlue);
+ method public final void switchToRows();
+ method public final void switchToVideo();
+ }
+
+ @Deprecated public class ErrorFragment extends androidx.leanback.app.BrandedFragment {
+ ctor @Deprecated public ErrorFragment();
+ method @Deprecated public android.graphics.drawable.Drawable! getBackgroundDrawable();
+ method @Deprecated public android.view.View.OnClickListener! getButtonClickListener();
+ method @Deprecated public String! getButtonText();
+ method @Deprecated public android.graphics.drawable.Drawable! getImageDrawable();
+ method @Deprecated public CharSequence! getMessage();
+ method @Deprecated public boolean isBackgroundTranslucent();
+ method @Deprecated public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @Deprecated public void setButtonClickListener(android.view.View.OnClickListener!);
+ method @Deprecated public void setButtonText(String!);
+ method @Deprecated public void setDefaultBackground(boolean);
+ method @Deprecated public void setImageDrawable(android.graphics.drawable.Drawable!);
+ method @Deprecated public void setMessage(CharSequence!);
+ }
+
+ public class ErrorSupportFragment extends androidx.leanback.app.BrandedSupportFragment {
+ ctor public ErrorSupportFragment();
+ method public android.graphics.drawable.Drawable! getBackgroundDrawable();
+ method public android.view.View.OnClickListener! getButtonClickListener();
+ method public String! getButtonText();
+ method public android.graphics.drawable.Drawable! getImageDrawable();
+ method public CharSequence! getMessage();
+ method public boolean isBackgroundTranslucent();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setButtonClickListener(android.view.View.OnClickListener!);
+ method public void setButtonText(String!);
+ method public void setDefaultBackground(boolean);
+ method public void setImageDrawable(android.graphics.drawable.Drawable!);
+ method public void setMessage(CharSequence!);
+ }
+
+ @Deprecated public class GuidedStepFragment extends android.app.Fragment {
+ ctor @Deprecated public GuidedStepFragment();
+ method @Deprecated public static int add(android.app.FragmentManager!, androidx.leanback.app.GuidedStepFragment!);
+ method @Deprecated public static int add(android.app.FragmentManager!, androidx.leanback.app.GuidedStepFragment!, int);
+ method @Deprecated public static int addAsRoot(android.app.Activity!, androidx.leanback.app.GuidedStepFragment!, int);
+ method @Deprecated public void collapseAction(boolean);
+ method @Deprecated public void collapseSubActions();
+ method @Deprecated public void expandAction(androidx.leanback.widget.GuidedAction!, boolean);
+ method @Deprecated public void expandSubActions(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public androidx.leanback.widget.GuidedAction! findActionById(long);
+ method @Deprecated public int findActionPositionById(long);
+ method @Deprecated public androidx.leanback.widget.GuidedAction! findButtonActionById(long);
+ method @Deprecated public int findButtonActionPositionById(long);
+ method @Deprecated public void finishGuidedStepFragments();
+ method @Deprecated public android.view.View! getActionItemView(int);
+ method @Deprecated public java.util.List<androidx.leanback.widget.GuidedAction>! getActions();
+ method @Deprecated public android.view.View! getButtonActionItemView(int);
+ method @Deprecated public java.util.List<androidx.leanback.widget.GuidedAction>! getButtonActions();
+ method @Deprecated public static androidx.leanback.app.GuidedStepFragment! getCurrentGuidedStepFragment(android.app.FragmentManager!);
+ method @Deprecated public androidx.leanback.widget.GuidanceStylist! getGuidanceStylist();
+ method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! getGuidedActionsStylist();
+ method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! getGuidedButtonActionsStylist();
+ method @Deprecated public int getSelectedActionPosition();
+ method @Deprecated public int getSelectedButtonActionPosition();
+ method @Deprecated public int getUiStyle();
+ method @Deprecated public boolean isExpanded();
+ method @Deprecated public boolean isFocusOutEndAllowed();
+ method @Deprecated public boolean isFocusOutStartAllowed();
+ method @Deprecated public boolean isSubActionsExpanded();
+ method @Deprecated public void notifyActionChanged(int);
+ method @Deprecated public void notifyButtonActionChanged(int);
+ method @Deprecated protected void onAddSharedElementTransition(android.app.FragmentTransaction!, androidx.leanback.app.GuidedStepFragment!);
+ method @Deprecated public void onCreateActions(java.util.List<androidx.leanback.widget.GuidedAction>, android.os.Bundle!);
+ method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! onCreateActionsStylist();
+ method @Deprecated public android.view.View! onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method @Deprecated public void onCreateButtonActions(java.util.List<androidx.leanback.widget.GuidedAction>, android.os.Bundle!);
+ method @Deprecated public androidx.leanback.widget.GuidedActionsStylist! onCreateButtonActionsStylist();
+ method @Deprecated public androidx.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle!);
+ method @Deprecated public androidx.leanback.widget.GuidanceStylist! onCreateGuidanceStylist();
+ method @Deprecated public void onGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void onGuidedActionEditCanceled(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void onGuidedActionEdited(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public long onGuidedActionEditedAndProceed(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void onGuidedActionFocused(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated protected void onProvideFragmentTransitions();
+ method @Deprecated public int onProvideTheme();
+ method @Deprecated public boolean onSubGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void openInEditMode(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void popBackStackToGuidedStepFragment(Class!, int);
+ method @Deprecated public void setActions(java.util.List<androidx.leanback.widget.GuidedAction>!);
+ method @Deprecated public void setActionsDiffCallback(androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction>!);
+ method @Deprecated public void setButtonActions(java.util.List<androidx.leanback.widget.GuidedAction>!);
+ method @Deprecated public void setSelectedActionPosition(int);
+ method @Deprecated public void setSelectedButtonActionPosition(int);
+ method @Deprecated public void setUiStyle(int);
+ field @Deprecated public static final String EXTRA_UI_STYLE = "uiStyle";
+ field @Deprecated public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+ field @Deprecated public static final int UI_STYLE_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+ field @Deprecated public static final int UI_STYLE_REPLACE = 0; // 0x0
+ }
+
+ public class GuidedStepSupportFragment extends androidx.fragment.app.Fragment {
+ ctor public GuidedStepSupportFragment();
+ method public static int add(androidx.fragment.app.FragmentManager!, androidx.leanback.app.GuidedStepSupportFragment!);
+ method public static int add(androidx.fragment.app.FragmentManager!, androidx.leanback.app.GuidedStepSupportFragment!, int);
+ method public static int addAsRoot(androidx.fragment.app.FragmentActivity!, androidx.leanback.app.GuidedStepSupportFragment!, int);
+ method public void collapseAction(boolean);
+ method public void collapseSubActions();
+ method public void expandAction(androidx.leanback.widget.GuidedAction!, boolean);
+ method public void expandSubActions(androidx.leanback.widget.GuidedAction!);
+ method public androidx.leanback.widget.GuidedAction! findActionById(long);
+ method public int findActionPositionById(long);
+ method public androidx.leanback.widget.GuidedAction! findButtonActionById(long);
+ method public int findButtonActionPositionById(long);
+ method public void finishGuidedStepSupportFragments();
+ method public android.view.View! getActionItemView(int);
+ method public java.util.List<androidx.leanback.widget.GuidedAction>! getActions();
+ method public android.view.View! getButtonActionItemView(int);
+ method public java.util.List<androidx.leanback.widget.GuidedAction>! getButtonActions();
+ method public static androidx.leanback.app.GuidedStepSupportFragment! getCurrentGuidedStepSupportFragment(androidx.fragment.app.FragmentManager!);
+ method public androidx.leanback.widget.GuidanceStylist! getGuidanceStylist();
+ method public androidx.leanback.widget.GuidedActionsStylist! getGuidedActionsStylist();
+ method public androidx.leanback.widget.GuidedActionsStylist! getGuidedButtonActionsStylist();
+ method public int getSelectedActionPosition();
+ method public int getSelectedButtonActionPosition();
+ method public int getUiStyle();
+ method public boolean isExpanded();
+ method public boolean isFocusOutEndAllowed();
+ method public boolean isFocusOutStartAllowed();
+ method public boolean isSubActionsExpanded();
+ method public void notifyActionChanged(int);
+ method public void notifyButtonActionChanged(int);
+ method protected void onAddSharedElementTransition(androidx.fragment.app.FragmentTransaction!, androidx.leanback.app.GuidedStepSupportFragment!);
+ method public void onCreateActions(java.util.List<androidx.leanback.widget.GuidedAction>, android.os.Bundle!);
+ method public androidx.leanback.widget.GuidedActionsStylist! onCreateActionsStylist();
+ method public android.view.View! onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method public void onCreateButtonActions(java.util.List<androidx.leanback.widget.GuidedAction>, android.os.Bundle!);
+ method public androidx.leanback.widget.GuidedActionsStylist! onCreateButtonActionsStylist();
+ method public androidx.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle!);
+ method public androidx.leanback.widget.GuidanceStylist! onCreateGuidanceStylist();
+ method public void onGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
+ method public void onGuidedActionEditCanceled(androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void onGuidedActionEdited(androidx.leanback.widget.GuidedAction!);
+ method public long onGuidedActionEditedAndProceed(androidx.leanback.widget.GuidedAction!);
+ method public void onGuidedActionFocused(androidx.leanback.widget.GuidedAction!);
+ method protected void onProvideFragmentTransitions();
+ method public int onProvideTheme();
+ method public boolean onSubGuidedActionClicked(androidx.leanback.widget.GuidedAction!);
+ method public void openInEditMode(androidx.leanback.widget.GuidedAction!);
+ method public void popBackStackToGuidedStepSupportFragment(Class!, int);
+ method public void setActions(java.util.List<androidx.leanback.widget.GuidedAction>!);
+ method public void setActionsDiffCallback(androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction>!);
+ method public void setButtonActions(java.util.List<androidx.leanback.widget.GuidedAction>!);
+ method public void setSelectedActionPosition(int);
+ method public void setSelectedButtonActionPosition(int);
+ method public void setUiStyle(int);
+ field public static final String EXTRA_UI_STYLE = "uiStyle";
+ field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+ field @Deprecated public static final int UI_STYLE_DEFAULT = 0; // 0x0
+ field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+ field public static final int UI_STYLE_REPLACE = 0; // 0x0
+ }
+
+ @Deprecated public class HeadersFragment extends android.app.Fragment {
+ ctor @Deprecated public HeadersFragment();
+ method @Deprecated public final androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @Deprecated public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
+ method @Deprecated public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
+ method @Deprecated public int getSelectedPosition();
+ method @Deprecated public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
+ method @Deprecated public boolean isScrolling();
+ method @Deprecated public void onTransitionEnd();
+ method @Deprecated public boolean onTransitionPrepare();
+ method @Deprecated public void onTransitionStart();
+ method @Deprecated public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setAlignment(int);
+ method @Deprecated public void setOnHeaderClickedListener(androidx.leanback.app.HeadersFragment.OnHeaderClickedListener!);
+ method @Deprecated public void setOnHeaderViewSelectedListener(androidx.leanback.app.HeadersFragment.OnHeaderViewSelectedListener!);
+ method @Deprecated public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method @Deprecated public void setSelectedPosition(int);
+ method @Deprecated public void setSelectedPosition(int, boolean);
+ }
+
+ @Deprecated public static interface HeadersFragment.OnHeaderClickedListener {
+ method @Deprecated public void onHeaderClicked(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
+ }
+
+ @Deprecated public static interface HeadersFragment.OnHeaderViewSelectedListener {
+ method @Deprecated public void onHeaderSelected(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
+ }
+
+ public class HeadersSupportFragment extends androidx.fragment.app.Fragment {
+ ctor public HeadersSupportFragment();
+ method public final androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
+ method public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
+ method public int getSelectedPosition();
+ method public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
+ method public boolean isScrolling();
+ method public void onTransitionEnd();
+ method public boolean onTransitionPrepare();
+ method public void onTransitionStart();
+ method public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setAlignment(int);
+ method public void setOnHeaderClickedListener(androidx.leanback.app.HeadersSupportFragment.OnHeaderClickedListener!);
+ method public void setOnHeaderViewSelectedListener(androidx.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener!);
+ method public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ }
+
+ public static interface HeadersSupportFragment.OnHeaderClickedListener {
+ method public void onHeaderClicked(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
+ }
+
+ public static interface HeadersSupportFragment.OnHeaderViewSelectedListener {
+ method public void onHeaderSelected(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, androidx.leanback.widget.Row!);
+ }
+
+ @Deprecated public abstract class OnboardingFragment extends android.app.Fragment {
+ ctor @Deprecated public OnboardingFragment();
+ method @Deprecated @ColorInt public final int getArrowBackgroundColor();
+ method @Deprecated @ColorInt public final int getArrowColor();
+ method @Deprecated protected final int getCurrentPageIndex();
+ method @Deprecated @ColorInt public final int getDescriptionViewTextColor();
+ method @Deprecated @ColorInt public final int getDotBackgroundColor();
+ method @Deprecated public final int getIconResourceId();
+ method @Deprecated public final int getLogoResourceId();
+ method @Deprecated protected abstract int getPageCount();
+ method @Deprecated protected abstract CharSequence! getPageDescription(int);
+ method @Deprecated protected abstract CharSequence! getPageTitle(int);
+ method @Deprecated public final CharSequence! getStartButtonText();
+ method @Deprecated @ColorInt public final int getTitleViewTextColor();
+ method @Deprecated protected final boolean isLogoAnimationFinished();
+ method @Deprecated protected void moveToNextPage();
+ method @Deprecated protected void moveToPreviousPage();
+ method @Deprecated protected abstract android.view.View? onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method @Deprecated protected abstract android.view.View? onCreateContentView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method @Deprecated protected android.animation.Animator! onCreateDescriptionAnimator();
+ method @Deprecated protected android.animation.Animator? onCreateEnterAnimation();
+ method @Deprecated protected abstract android.view.View? onCreateForegroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method @Deprecated protected android.animation.Animator? onCreateLogoAnimation();
+ method @Deprecated protected android.animation.Animator! onCreateTitleAnimator();
+ method @Deprecated protected void onFinishFragment();
+ method @Deprecated protected void onLogoAnimationFinished();
+ method @Deprecated protected void onPageChanged(int, int);
+ method @Deprecated public int onProvideTheme();
+ method @Deprecated public void setArrowBackgroundColor(@ColorInt int);
+ method @Deprecated public void setArrowColor(@ColorInt int);
+ method @Deprecated public void setDescriptionViewTextColor(@ColorInt int);
+ method @Deprecated public void setDotBackgroundColor(@ColorInt int);
+ method @Deprecated public final void setIconResouceId(int);
+ method @Deprecated public final void setLogoResourceId(int);
+ method @Deprecated public void setStartButtonText(CharSequence!);
+ method @Deprecated public void setTitleViewTextColor(@ColorInt int);
+ method @Deprecated protected final void startEnterAnimation(boolean);
+ }
+
+ public abstract class OnboardingSupportFragment extends androidx.fragment.app.Fragment {
+ ctor public OnboardingSupportFragment();
+ method @ColorInt public final int getArrowBackgroundColor();
+ method @ColorInt public final int getArrowColor();
+ method protected final int getCurrentPageIndex();
+ method @ColorInt public final int getDescriptionViewTextColor();
+ method @ColorInt public final int getDotBackgroundColor();
+ method public final int getIconResourceId();
+ method public final int getLogoResourceId();
+ method protected abstract int getPageCount();
+ method protected abstract CharSequence! getPageDescription(int);
+ method protected abstract CharSequence! getPageTitle(int);
+ method public final CharSequence! getStartButtonText();
+ method @ColorInt public final int getTitleViewTextColor();
+ method protected final boolean isLogoAnimationFinished();
+ method protected void moveToNextPage();
+ method protected void moveToPreviousPage();
+ method protected abstract android.view.View? onCreateBackgroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method protected abstract android.view.View? onCreateContentView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method protected android.animation.Animator! onCreateDescriptionAnimator();
+ method protected android.animation.Animator? onCreateEnterAnimation();
+ method protected abstract android.view.View? onCreateForegroundView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method protected android.animation.Animator? onCreateLogoAnimation();
+ method protected android.animation.Animator! onCreateTitleAnimator();
+ method protected void onFinishFragment();
+ method protected void onLogoAnimationFinished();
+ method protected void onPageChanged(int, int);
+ method public int onProvideTheme();
+ method public void setArrowBackgroundColor(@ColorInt int);
+ method public void setArrowColor(@ColorInt int);
+ method public void setDescriptionViewTextColor(@ColorInt int);
+ method public void setDotBackgroundColor(@ColorInt int);
+ method public final void setIconResouceId(int);
+ method public final void setLogoResourceId(int);
+ method public void setStartButtonText(CharSequence!);
+ method public void setTitleViewTextColor(@ColorInt int);
+ method protected final void startEnterAnimation(boolean);
+ }
+
+ @Deprecated public class PlaybackFragment extends android.app.Fragment {
+ ctor @Deprecated public PlaybackFragment();
+ method @Deprecated public void fadeOut();
+ method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @Deprecated public int getBackgroundType();
+ method @Deprecated public androidx.leanback.app.ProgressBarManager! getProgressBarManager();
+ method @Deprecated public void hideControlsOverlay(boolean);
+ method @Deprecated public boolean isControlsOverlayAutoHideEnabled();
+ method @Deprecated public boolean isControlsOverlayVisible();
+ method @Deprecated public boolean isFadingEnabled();
+ method @Deprecated public boolean isShowOrHideControlsOverlayOnUserInteraction();
+ method @Deprecated public void notifyPlaybackRowChanged();
+ method @Deprecated protected void onBufferingStateChanged(boolean);
+ method @Deprecated protected void onError(int, CharSequence!);
+ method @Deprecated protected void onVideoSizeChanged(int, int);
+ method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setBackgroundType(int);
+ method @Deprecated public void setControlsOverlayAutoHideEnabled(boolean);
+ method @Deprecated public void setFadingEnabled(boolean);
+ method @Deprecated public void setHostCallback(androidx.leanback.media.PlaybackGlueHost.HostCallback!);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method @Deprecated public final void setOnKeyInterceptListener(android.view.View.OnKeyListener!);
+ method @Deprecated public void setOnPlaybackItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method @Deprecated public void setPlaybackRow(androidx.leanback.widget.Row!);
+ method @Deprecated public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
+ method @Deprecated public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
+ method @Deprecated public void setSelectedPosition(int);
+ method @Deprecated public void setSelectedPosition(int, boolean);
+ method @Deprecated public void setShowOrHideControlsOverlayOnUserInteraction(boolean);
+ method @Deprecated public void showControlsOverlay(boolean);
+ method @Deprecated public void tickle();
+ field @Deprecated public static final int BG_DARK = 1; // 0x1
+ field @Deprecated public static final int BG_LIGHT = 2; // 0x2
+ field @Deprecated public static final int BG_NONE = 0; // 0x0
+ }
+
+ @Deprecated public class PlaybackFragmentGlueHost extends androidx.leanback.media.PlaybackGlueHost implements androidx.leanback.widget.PlaybackSeekUi {
+ ctor @Deprecated public PlaybackFragmentGlueHost(androidx.leanback.app.PlaybackFragment!);
+ method @Deprecated public void fadeOut();
+ method @Deprecated public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
+ }
+
+ public class PlaybackSupportFragment extends androidx.fragment.app.Fragment {
+ ctor public PlaybackSupportFragment();
+ method @Deprecated public void fadeOut();
+ method public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method public int getBackgroundType();
+ method public androidx.leanback.app.ProgressBarManager! getProgressBarManager();
+ method public void hideControlsOverlay(boolean);
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public boolean isControlsOverlayVisible();
+ method @Deprecated public boolean isFadingEnabled();
+ method public boolean isShowOrHideControlsOverlayOnUserInteraction();
+ method public void notifyPlaybackRowChanged();
+ method protected void onBufferingStateChanged(boolean);
+ method protected void onError(int, CharSequence!);
+ method protected void onVideoSizeChanged(int, int);
+ method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setBackgroundType(int);
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method @Deprecated public void setFadingEnabled(boolean);
+ method public void setHostCallback(androidx.leanback.media.PlaybackGlueHost.HostCallback!);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener!);
+ method public void setOnPlaybackItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method public void setPlaybackRow(androidx.leanback.widget.Row!);
+ method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
+ method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ method public void setShowOrHideControlsOverlayOnUserInteraction(boolean);
+ method public void showControlsOverlay(boolean);
+ method public void tickle();
+ field public static final int BG_DARK = 1; // 0x1
+ field public static final int BG_LIGHT = 2; // 0x2
+ field public static final int BG_NONE = 0; // 0x0
+ }
+
+ public class PlaybackSupportFragmentGlueHost extends androidx.leanback.media.PlaybackGlueHost implements androidx.leanback.widget.PlaybackSeekUi {
+ ctor public PlaybackSupportFragmentGlueHost(androidx.leanback.app.PlaybackSupportFragment!);
+ method public void fadeOut();
+ method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
+ }
+
+ public final class ProgressBarManager {
+ ctor public ProgressBarManager();
+ method public void disableProgressBar();
+ method public void enableProgressBar();
+ method public long getInitialDelay();
+ method public void hide();
+ method public void setInitialDelay(long);
+ method public void setProgressBarView(android.view.View!);
+ method public void setRootView(android.view.ViewGroup!);
+ method public void show();
+ }
+
+ @Deprecated public class RowsFragment extends android.app.Fragment implements androidx.leanback.app.BrowseFragment.MainFragmentAdapterProvider androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
+ ctor @Deprecated public RowsFragment();
+ method @Deprecated public void enableRowScaling(boolean);
+ method @Deprecated protected androidx.leanback.widget.VerticalGridView! findGridViewFromRoot(android.view.View!);
+ method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
+ method @Deprecated public final androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @Deprecated public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
+ method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentAdapter! getMainFragmentAdapter();
+ method @Deprecated public androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
+ method @Deprecated public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
+ method @Deprecated public androidx.leanback.widget.BaseOnItemViewSelectedListener! getOnItemViewSelectedListener();
+ method @Deprecated public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
+ method @Deprecated public androidx.leanback.widget.RowPresenter.ViewHolder! getRowViewHolder(int);
+ method @Deprecated public int getSelectedPosition();
+ method @Deprecated public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
+ method @Deprecated public boolean isScrolling();
+ method @Deprecated public void onTransitionEnd();
+ method @Deprecated public boolean onTransitionPrepare();
+ method @Deprecated public void onTransitionStart();
+ method @Deprecated public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setAlignment(int);
+ method @Deprecated public void setEntranceTransitionState(boolean);
+ method @Deprecated public void setExpand(boolean);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method @Deprecated public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method @Deprecated public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method @Deprecated public void setSelectedPosition(int);
+ method @Deprecated public void setSelectedPosition(int, boolean);
+ }
+
+ @Deprecated public static class RowsFragment.MainFragmentAdapter extends androidx.leanback.app.BrowseFragment.MainFragmentAdapter<androidx.leanback.app.RowsFragment> {
+ ctor @Deprecated public RowsFragment.MainFragmentAdapter(androidx.leanback.app.RowsFragment!);
+ }
+
+ @Deprecated public static class RowsFragment.MainFragmentRowsAdapter extends androidx.leanback.app.BrowseFragment.MainFragmentRowsAdapter<androidx.leanback.app.RowsFragment> {
+ ctor @Deprecated public RowsFragment.MainFragmentRowsAdapter(androidx.leanback.app.RowsFragment!);
+ }
+
+ public class RowsSupportFragment extends androidx.fragment.app.Fragment implements androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+ ctor public RowsSupportFragment();
+ method @Deprecated public void enableRowScaling(boolean);
+ method protected androidx.leanback.widget.VerticalGridView! findGridViewFromRoot(android.view.View!);
+ method public androidx.leanback.widget.RowPresenter.ViewHolder! findRowViewHolderByPosition(int);
+ method public final androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
+ method public androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter! getMainFragmentAdapter();
+ method public androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter! getMainFragmentRowsAdapter();
+ method public androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
+ method public androidx.leanback.widget.BaseOnItemViewSelectedListener! getOnItemViewSelectedListener();
+ method public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
+ method public androidx.leanback.widget.RowPresenter.ViewHolder! getRowViewHolder(int);
+ method public int getSelectedPosition();
+ method public final androidx.leanback.widget.VerticalGridView! getVerticalGridView();
+ method public boolean isScrolling();
+ method public void onTransitionEnd();
+ method public boolean onTransitionPrepare();
+ method public void onTransitionStart();
+ method public final void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setAlignment(int);
+ method public void setEntranceTransitionState(boolean);
+ method public void setExpand(boolean);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method public void setSelectedPosition(int, boolean, androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, boolean);
+ }
+
+ public static class RowsSupportFragment.MainFragmentAdapter extends androidx.leanback.app.BrowseSupportFragment.MainFragmentAdapter<androidx.leanback.app.RowsSupportFragment> {
+ ctor public RowsSupportFragment.MainFragmentAdapter(androidx.leanback.app.RowsSupportFragment!);
+ }
+
+ public static class RowsSupportFragment.MainFragmentRowsAdapter extends androidx.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter<androidx.leanback.app.RowsSupportFragment> {
+ ctor public RowsSupportFragment.MainFragmentRowsAdapter(androidx.leanback.app.RowsSupportFragment!);
+ }
+
+ @Deprecated public class SearchFragment extends android.app.Fragment {
+ ctor @Deprecated public SearchFragment();
+ method @Deprecated public static android.os.Bundle! createArgs(android.os.Bundle!, String!);
+ method @Deprecated public static android.os.Bundle! createArgs(android.os.Bundle!, String!, String!);
+ method @Deprecated public void displayCompletions(java.util.List<java.lang.String>!);
+ method @Deprecated public void displayCompletions(android.view.inputmethod.CompletionInfo[]!);
+ method @Deprecated public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method @Deprecated public android.content.Intent! getRecognizerIntent();
+ method @Deprecated public androidx.leanback.app.RowsFragment! getRowsFragment();
+ method @Deprecated public String! getTitle();
+ method @Deprecated public static androidx.leanback.app.SearchFragment! newInstance(String!);
+ method @Deprecated public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method @Deprecated public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method @Deprecated public void setSearchAffordanceColorsInListening(androidx.leanback.widget.SearchOrbView.Colors!);
+ method @Deprecated public void setSearchQuery(String!, boolean);
+ method @Deprecated public void setSearchQuery(android.content.Intent!, boolean);
+ method @Deprecated public void setSearchResultProvider(androidx.leanback.app.SearchFragment.SearchResultProvider!);
+ method @Deprecated public void setSpeechRecognitionCallback(androidx.leanback.widget.SpeechRecognitionCallback!);
+ method @Deprecated public void setTitle(String!);
+ method @Deprecated public void startRecognition();
+ }
+
+ @Deprecated public static interface SearchFragment.SearchResultProvider {
+ method @Deprecated public androidx.leanback.widget.ObjectAdapter! getResultsAdapter();
+ method @Deprecated public boolean onQueryTextChange(String!);
+ method @Deprecated public boolean onQueryTextSubmit(String!);
+ }
+
+ public class SearchSupportFragment extends androidx.fragment.app.Fragment {
+ ctor public SearchSupportFragment();
+ method public static android.os.Bundle! createArgs(android.os.Bundle!, String!);
+ method public static android.os.Bundle! createArgs(android.os.Bundle!, String!, String!);
+ method public void displayCompletions(java.util.List<java.lang.String>!);
+ method public void displayCompletions(android.view.inputmethod.CompletionInfo[]!);
+ method public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method public android.content.Intent! getRecognizerIntent();
+ method public androidx.leanback.app.RowsSupportFragment! getRowsSupportFragment();
+ method public String! getTitle();
+ method public static androidx.leanback.app.SearchSupportFragment! newInstance(String!);
+ method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setSearchAffordanceColorsInListening(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setSearchQuery(String!, boolean);
+ method public void setSearchQuery(android.content.Intent!, boolean);
+ method public void setSearchResultProvider(androidx.leanback.app.SearchSupportFragment.SearchResultProvider!);
+ method @Deprecated public void setSpeechRecognitionCallback(androidx.leanback.widget.SpeechRecognitionCallback!);
+ method public void setTitle(String!);
+ method public void startRecognition();
+ }
+
+ public static interface SearchSupportFragment.SearchResultProvider {
+ method public androidx.leanback.widget.ObjectAdapter! getResultsAdapter();
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ @Deprecated public class VerticalGridFragment extends androidx.leanback.app.BaseFragment {
+ method @Deprecated public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method @Deprecated public androidx.leanback.widget.VerticalGridPresenter! getGridPresenter();
+ method @Deprecated public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
+ method @Deprecated public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setGridPresenter(androidx.leanback.widget.VerticalGridPresenter!);
+ method @Deprecated public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method @Deprecated public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method @Deprecated public void setSelectedPosition(int);
+ }
+
+ public class VerticalGridSupportFragment extends androidx.leanback.app.BaseSupportFragment {
+ method public androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method public androidx.leanback.widget.VerticalGridPresenter! getGridPresenter();
+ method public androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
+ method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setGridPresenter(androidx.leanback.widget.VerticalGridPresenter!);
+ method public void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method public void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method public void setSelectedPosition(int);
+ }
+
+ @Deprecated public class VideoFragment extends androidx.leanback.app.PlaybackFragment {
+ ctor @Deprecated public VideoFragment();
+ method @Deprecated public android.view.SurfaceView! getSurfaceView();
+ method @Deprecated public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
+ }
+
+ @Deprecated public class VideoFragmentGlueHost extends androidx.leanback.app.PlaybackFragmentGlueHost implements androidx.leanback.media.SurfaceHolderGlueHost {
+ ctor @Deprecated public VideoFragmentGlueHost(androidx.leanback.app.VideoFragment!);
+ method @Deprecated public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
+ }
+
+ public class VideoSupportFragment extends androidx.leanback.app.PlaybackSupportFragment {
+ ctor public VideoSupportFragment();
+ method public android.view.SurfaceView! getSurfaceView();
+ method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
+ }
+
+ public class VideoSupportFragmentGlueHost extends androidx.leanback.app.PlaybackSupportFragmentGlueHost implements androidx.leanback.media.SurfaceHolderGlueHost {
+ ctor public VideoSupportFragmentGlueHost(androidx.leanback.app.VideoSupportFragment!);
+ method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
+ }
+
+}
+
+package androidx.leanback.database {
+
+ public abstract class CursorMapper {
+ ctor public CursorMapper();
+ method protected abstract Object! bind(android.database.Cursor!);
+ method protected abstract void bindColumns(android.database.Cursor!);
+ method public Object! convert(android.database.Cursor!);
+ }
+
+}
+
+package androidx.leanback.graphics {
+
+ public class BoundsRule {
+ ctor public BoundsRule();
+ ctor public BoundsRule(androidx.leanback.graphics.BoundsRule!);
+ method public void calculateBounds(android.graphics.Rect!, android.graphics.Rect!);
+ field public androidx.leanback.graphics.BoundsRule.ValueRule! bottom;
+ field public androidx.leanback.graphics.BoundsRule.ValueRule! left;
+ field public androidx.leanback.graphics.BoundsRule.ValueRule! right;
+ field public androidx.leanback.graphics.BoundsRule.ValueRule! top;
+ }
+
+ public static final class BoundsRule.ValueRule {
+ method public static androidx.leanback.graphics.BoundsRule.ValueRule! absoluteValue(int);
+ method public int getAbsoluteValue();
+ method public float getFraction();
+ method public static androidx.leanback.graphics.BoundsRule.ValueRule! inheritFromParent(float);
+ method public static androidx.leanback.graphics.BoundsRule.ValueRule! inheritFromParentWithOffset(float, int);
+ method public void setAbsoluteValue(int);
+ method public void setFraction(float);
+ }
+
+ public final class ColorFilterCache {
+ method public static androidx.leanback.graphics.ColorFilterCache! getColorFilterCache(int);
+ method public android.graphics.ColorFilter! getFilterForLevel(float);
+ }
+
+ public final class ColorFilterDimmer {
+ method public void applyFilterToView(android.view.View!);
+ method public static androidx.leanback.graphics.ColorFilterDimmer! create(androidx.leanback.graphics.ColorFilterCache!, float, float);
+ method public static androidx.leanback.graphics.ColorFilterDimmer! createDefault(android.content.Context!);
+ method public android.graphics.ColorFilter! getColorFilter();
+ method public android.graphics.Paint! getPaint();
+ method public void setActiveLevel(float);
+ }
+
+ public final class ColorOverlayDimmer {
+ method public int applyToColor(int);
+ method public static androidx.leanback.graphics.ColorOverlayDimmer! createColorOverlayDimmer(int, float, float);
+ method public static androidx.leanback.graphics.ColorOverlayDimmer! createDefault(android.content.Context!);
+ method public void drawColorOverlay(android.graphics.Canvas!, android.view.View!, boolean);
+ method public int getAlpha();
+ method public float getAlphaFloat();
+ method public android.graphics.Paint! getPaint();
+ method public boolean needsDraw();
+ method public void setActiveLevel(float);
+ }
+
+ public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public CompositeDrawable();
+ method public void addChildDrawable(android.graphics.drawable.Drawable!);
+ method public void draw(android.graphics.Canvas!);
+ method public androidx.leanback.graphics.CompositeDrawable.ChildDrawable! getChildAt(int);
+ method public int getChildCount();
+ method public android.graphics.drawable.Drawable! getDrawable(int);
+ method public int getOpacity();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+ method public void removeChild(int);
+ method public void removeDrawable(android.graphics.drawable.Drawable!);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+ method public void setAlpha(int);
+ method public void setChildDrawableAt(int, android.graphics.drawable.Drawable!);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+ }
+
+ public static final class CompositeDrawable.ChildDrawable {
+ ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable!, androidx.leanback.graphics.CompositeDrawable!);
+ method public androidx.leanback.graphics.BoundsRule! getBoundsRule();
+ method public android.graphics.drawable.Drawable! getDrawable();
+ method public void recomputeBounds();
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Integer>! BOTTOM_ABSOLUTE;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Float>! BOTTOM_FRACTION;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Integer>! LEFT_ABSOLUTE;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Float>! LEFT_FRACTION;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Integer>! RIGHT_ABSOLUTE;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Float>! RIGHT_FRACTION;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Integer>! TOP_ABSOLUTE;
+ field public static final android.util.Property<androidx.leanback.graphics.CompositeDrawable.ChildDrawable,java.lang.Float>! TOP_FRACTION;
+ }
+
+ public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
+ ctor public FitWidthBitmapDrawable();
+ method public void draw(android.graphics.Canvas!);
+ method public android.graphics.Bitmap! getBitmap();
+ method public int getOpacity();
+ method public android.graphics.Rect! getSource();
+ method public int getVerticalOffset();
+ method public void setAlpha(int);
+ method public void setBitmap(android.graphics.Bitmap!);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setSource(android.graphics.Rect!);
+ method public void setVerticalOffset(int);
+ field public static final android.util.Property<androidx.leanback.graphics.FitWidthBitmapDrawable,java.lang.Integer>! PROPERTY_VERTICAL_OFFSET;
+ }
+
+}
+
+package androidx.leanback.media {
+
+ public class MediaControllerAdapter extends androidx.leanback.media.PlayerAdapter {
+ ctor public MediaControllerAdapter(android.support.v4.media.session.MediaControllerCompat!);
+ method public android.graphics.drawable.Drawable! getMediaArt(android.content.Context!);
+ method public android.support.v4.media.session.MediaControllerCompat! getMediaController();
+ method public CharSequence! getMediaSubtitle();
+ method public CharSequence! getMediaTitle();
+ method public void pause();
+ method public void play();
+ }
+
+ @Deprecated public abstract class MediaControllerGlue extends androidx.leanback.media.PlaybackControlGlue {
+ ctor @Deprecated public MediaControllerGlue(android.content.Context!, int[]!, int[]!);
+ method @Deprecated public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat!);
+ method @Deprecated public void detach();
+ method @Deprecated public int getCurrentPosition();
+ method @Deprecated public int getCurrentSpeedId();
+ method @Deprecated public android.graphics.drawable.Drawable! getMediaArt();
+ method @Deprecated public final android.support.v4.media.session.MediaControllerCompat! getMediaController();
+ method @Deprecated public int getMediaDuration();
+ method @Deprecated public CharSequence! getMediaSubtitle();
+ method @Deprecated public CharSequence! getMediaTitle();
+ method @Deprecated public long getSupportedActions();
+ method @Deprecated public boolean hasValidMedia();
+ method @Deprecated public boolean isMediaPlaying();
+ }
+
+ public class MediaPlayerAdapter extends androidx.leanback.media.PlayerAdapter {
+ ctor public MediaPlayerAdapter(android.content.Context!);
+ method public final android.media.MediaPlayer! getMediaPlayer();
+ method public int getProgressUpdatingInterval();
+ method protected boolean onError(int, int);
+ method protected boolean onInfo(int, int);
+ method protected void onSeekComplete();
+ method public void pause();
+ method public void play();
+ method public void release();
+ method public void reset();
+ method public boolean setDataSource(android.net.Uri!);
+ }
+
+ public class PlaybackBannerControlGlue<T extends androidx.leanback.media.PlayerAdapter> extends androidx.leanback.media.PlaybackBaseControlGlue<T> {
+ ctor public PlaybackBannerControlGlue(android.content.Context!, int[]!, T!);
+ ctor public PlaybackBannerControlGlue(android.content.Context!, int[]!, int[]!, T!);
+ method public int[] getFastForwardSpeeds();
+ method public int[] getRewindSpeeds();
+ method public void onActionClicked(androidx.leanback.widget.Action!);
+ method protected androidx.leanback.widget.PlaybackRowPresenter! onCreateRowPresenter();
+ method public boolean onKey(android.view.View!, int, android.view.KeyEvent!);
+ field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+ field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+ field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+ field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+ field public static final int ACTION_REWIND = 32; // 0x20
+ field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+ field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+ field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+ field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+ field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+ field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+ field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+ field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+ field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+ field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+ }
+
+ public abstract class PlaybackBaseControlGlue<T extends androidx.leanback.media.PlayerAdapter> extends androidx.leanback.media.PlaybackGlue implements androidx.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+ ctor public PlaybackBaseControlGlue(android.content.Context!, T!);
+ method public android.graphics.drawable.Drawable! getArt();
+ method public final long getBufferedPosition();
+ method public androidx.leanback.widget.PlaybackControlsRow! getControlsRow();
+ method public long getCurrentPosition();
+ method public final long getDuration();
+ method public androidx.leanback.widget.PlaybackRowPresenter! getPlaybackRowPresenter();
+ method public final T! getPlayerAdapter();
+ method public CharSequence! getSubtitle();
+ method public long getSupportedActions();
+ method public CharSequence! getTitle();
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public final boolean isPlaying();
+ method public final boolean isPrepared();
+ method protected static void notifyItemChanged(androidx.leanback.widget.ArrayObjectAdapter!, Object!);
+ method protected void onCreatePrimaryActions(androidx.leanback.widget.ArrayObjectAdapter!);
+ method protected abstract androidx.leanback.widget.PlaybackRowPresenter! onCreateRowPresenter();
+ method protected void onCreateSecondaryActions(androidx.leanback.widget.ArrayObjectAdapter!);
+ method protected void onMetadataChanged();
+ method @CallSuper protected void onPlayCompleted();
+ method @CallSuper protected void onPlayStateChanged();
+ method @CallSuper protected void onPreparedStateChanged();
+ method @CallSuper protected void onUpdateBufferedProgress();
+ method @CallSuper protected void onUpdateDuration();
+ method @CallSuper protected void onUpdateProgress();
+ method public final void seekTo(long);
+ method public void setArt(android.graphics.drawable.Drawable!);
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method public void setControlsRow(androidx.leanback.widget.PlaybackControlsRow!);
+ method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+ field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+ field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+ field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+ field public static final int ACTION_REPEAT = 512; // 0x200
+ field public static final int ACTION_REWIND = 32; // 0x20
+ field public static final int ACTION_SHUFFLE = 1024; // 0x400
+ field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+ field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+ }
+
+ public abstract class PlaybackControlGlue extends androidx.leanback.media.PlaybackGlue implements androidx.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+ ctor public PlaybackControlGlue(android.content.Context!, int[]!);
+ ctor public PlaybackControlGlue(android.content.Context!, int[]!, int[]!);
+ method public void enableProgressUpdating(boolean);
+ method public androidx.leanback.widget.PlaybackControlsRow! getControlsRow();
+ method @Deprecated public androidx.leanback.widget.PlaybackControlsRowPresenter! getControlsRowPresenter();
+ method public abstract int getCurrentPosition();
+ method public abstract int getCurrentSpeedId();
+ method public int[]! getFastForwardSpeeds();
+ method public abstract android.graphics.drawable.Drawable! getMediaArt();
+ method public abstract int getMediaDuration();
+ method public abstract CharSequence! getMediaSubtitle();
+ method public abstract CharSequence! getMediaTitle();
+ method public androidx.leanback.widget.PlaybackRowPresenter! getPlaybackRowPresenter();
+ method public int[]! getRewindSpeeds();
+ method public abstract long getSupportedActions();
+ method public int getUpdatePeriod();
+ method public abstract boolean hasValidMedia();
+ method public boolean isFadingEnabled();
+ method public abstract boolean isMediaPlaying();
+ method public void onActionClicked(androidx.leanback.widget.Action!);
+ method protected void onCreateControlsRowAndPresenter();
+ method protected void onCreatePrimaryActions(androidx.leanback.widget.SparseArrayObjectAdapter!);
+ method protected void onCreateSecondaryActions(androidx.leanback.widget.ArrayObjectAdapter!);
+ method public boolean onKey(android.view.View!, int, android.view.KeyEvent!);
+ method protected void onMetadataChanged();
+ method protected void onStateChanged();
+ method public void play(int);
+ method public final void play();
+ method public void setControlsRow(androidx.leanback.widget.PlaybackControlsRow!);
+ method @Deprecated public void setControlsRowPresenter(androidx.leanback.widget.PlaybackControlsRowPresenter!);
+ method public void setFadingEnabled(boolean);
+ method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
+ method public void updateProgress();
+ field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+ field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+ field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+ field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+ field public static final int ACTION_REWIND = 32; // 0x20
+ field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+ field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+ field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+ field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+ field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+ field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+ field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+ field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+ field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+ field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+ }
+
+ public abstract class PlaybackGlue {
+ ctor public PlaybackGlue(android.content.Context!);
+ method public void addPlayerCallback(androidx.leanback.media.PlaybackGlue.PlayerCallback!);
+ method public android.content.Context! getContext();
+ method public androidx.leanback.media.PlaybackGlueHost! getHost();
+ method protected java.util.List<androidx.leanback.media.PlaybackGlue.PlayerCallback>! getPlayerCallbacks();
+ method public boolean isPlaying();
+ method public boolean isPrepared();
+ method public void next();
+ method @CallSuper protected void onAttachedToHost(androidx.leanback.media.PlaybackGlueHost!);
+ method @CallSuper protected void onDetachedFromHost();
+ method protected void onHostPause();
+ method protected void onHostResume();
+ method protected void onHostStart();
+ method protected void onHostStop();
+ method public void pause();
+ method public void play();
+ method public void playWhenPrepared();
+ method public void previous();
+ method public void removePlayerCallback(androidx.leanback.media.PlaybackGlue.PlayerCallback!);
+ method public final void setHost(androidx.leanback.media.PlaybackGlueHost!);
+ }
+
+ public abstract static class PlaybackGlue.PlayerCallback {
+ ctor public PlaybackGlue.PlayerCallback();
+ method public void onPlayCompleted(androidx.leanback.media.PlaybackGlue!);
+ method public void onPlayStateChanged(androidx.leanback.media.PlaybackGlue!);
+ method public void onPreparedStateChanged(androidx.leanback.media.PlaybackGlue!);
+ }
+
+ public abstract class PlaybackGlueHost {
+ ctor public PlaybackGlueHost();
+ method @Deprecated public void fadeOut();
+ method public androidx.leanback.media.PlaybackGlueHost.PlayerCallback! getPlayerCallback();
+ method public void hideControlsOverlay(boolean);
+ method public boolean isControlsOverlayAutoHideEnabled();
+ method public boolean isControlsOverlayVisible();
+ method public void notifyPlaybackRowChanged();
+ method public void setControlsOverlayAutoHideEnabled(boolean);
+ method @Deprecated public void setFadingEnabled(boolean);
+ method public void setHostCallback(androidx.leanback.media.PlaybackGlueHost.HostCallback!);
+ method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
+ method public void setOnKeyInterceptListener(android.view.View.OnKeyListener!);
+ method public void setPlaybackRow(androidx.leanback.widget.Row!);
+ method public void setPlaybackRowPresenter(androidx.leanback.widget.PlaybackRowPresenter!);
+ method public void showControlsOverlay(boolean);
+ }
+
+ public abstract static class PlaybackGlueHost.HostCallback {
+ ctor public PlaybackGlueHost.HostCallback();
+ method public void onHostDestroy();
+ method public void onHostPause();
+ method public void onHostResume();
+ method public void onHostStart();
+ method public void onHostStop();
+ }
+
+ public static class PlaybackGlueHost.PlayerCallback {
+ ctor public PlaybackGlueHost.PlayerCallback();
+ method public void onBufferingStateChanged(boolean);
+ method public void onError(int, CharSequence!);
+ method public void onVideoSizeChanged(int, int);
+ }
+
+ public class PlaybackTransportControlGlue<T extends androidx.leanback.media.PlayerAdapter> extends androidx.leanback.media.PlaybackBaseControlGlue<T> {
+ ctor public PlaybackTransportControlGlue(android.content.Context!, T!);
+ method public final androidx.leanback.widget.PlaybackSeekDataProvider! getSeekProvider();
+ method public final boolean isSeekEnabled();
+ method public void onActionClicked(androidx.leanback.widget.Action!);
+ method protected androidx.leanback.widget.PlaybackRowPresenter! onCreateRowPresenter();
+ method public boolean onKey(android.view.View!, int, android.view.KeyEvent!);
+ method public final void setSeekEnabled(boolean);
+ method public final void setSeekProvider(androidx.leanback.widget.PlaybackSeekDataProvider!);
+ }
+
+ public abstract class PlayerAdapter {
+ ctor public PlayerAdapter();
+ method public void fastForward();
+ method public long getBufferedPosition();
+ method public final androidx.leanback.media.PlayerAdapter.Callback! getCallback();
+ method public long getCurrentPosition();
+ method public long getDuration();
+ method public long getSupportedActions();
+ method public boolean isPlaying();
+ method public boolean isPrepared();
+ method public void next();
+ method public void onAttachedToHost(androidx.leanback.media.PlaybackGlueHost!);
+ method public void onDetachedFromHost();
+ method public abstract void pause();
+ method public abstract void play();
+ method public void previous();
+ method public void rewind();
+ method public void seekTo(long);
+ method public final void setCallback(androidx.leanback.media.PlayerAdapter.Callback!);
+ method public void setProgressUpdatingEnabled(boolean);
+ method public void setRepeatAction(int);
+ method public void setShuffleAction(int);
+ }
+
+ public static class PlayerAdapter.Callback {
+ ctor public PlayerAdapter.Callback();
+ method public void onBufferedPositionChanged(androidx.leanback.media.PlayerAdapter!);
+ method public void onBufferingStateChanged(androidx.leanback.media.PlayerAdapter!, boolean);
+ method public void onCurrentPositionChanged(androidx.leanback.media.PlayerAdapter!);
+ method public void onDurationChanged(androidx.leanback.media.PlayerAdapter!);
+ method public void onError(androidx.leanback.media.PlayerAdapter!, int, String!);
+ method public void onMetadataChanged(androidx.leanback.media.PlayerAdapter!);
+ method public void onPlayCompleted(androidx.leanback.media.PlayerAdapter!);
+ method public void onPlayStateChanged(androidx.leanback.media.PlayerAdapter!);
+ method public void onPreparedStateChanged(androidx.leanback.media.PlayerAdapter!);
+ method public void onVideoSizeChanged(androidx.leanback.media.PlayerAdapter!, int, int);
+ }
+
+ public interface SurfaceHolderGlueHost {
+ method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback!);
+ }
+
+}
+
+package androidx.leanback.system {
+
+ public class Settings {
+ method public boolean getBoolean(String!);
+ method public static androidx.leanback.system.Settings! getInstance(android.content.Context!);
+ method public void setBoolean(String!, boolean);
+ field public static final String OUTLINE_CLIPPING_DISABLED = "OUTLINE_CLIPPING_DISABLED";
+ field public static final String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
+ }
+
+}
+
+package androidx.leanback.widget {
+
+ public abstract class AbstractDetailsDescriptionPresenter extends androidx.leanback.widget.Presenter {
+ ctor public AbstractDetailsDescriptionPresenter();
+ method protected abstract void onBindDescription(androidx.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder!, Object!);
+ method public final void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public final androidx.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ }
+
+ public static class AbstractDetailsDescriptionPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
+ ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View!);
+ method public android.widget.TextView! getBody();
+ method public android.widget.TextView! getSubtitle();
+ method public android.widget.TextView! getTitle();
+ }
+
+ public abstract class AbstractMediaItemPresenter extends androidx.leanback.widget.RowPresenter {
+ ctor public AbstractMediaItemPresenter();
+ ctor public AbstractMediaItemPresenter(int);
+ method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method public androidx.leanback.widget.Presenter! getActionPresenter();
+ method protected int getMediaPlayState(Object!);
+ method public int getThemeId();
+ method public boolean hasMediaRowSeparator();
+ method protected abstract void onBindMediaDetails(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!, Object!);
+ method public void onBindMediaPlayState(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
+ method protected void onBindRowActions(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
+ method protected void onUnbindMediaDetails(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
+ method public void onUnbindMediaPlayState(androidx.leanback.widget.AbstractMediaItemPresenter.ViewHolder!);
+ method public void setActionPresenter(androidx.leanback.widget.Presenter!);
+ method public void setBackgroundColor(int);
+ method public void setHasMediaRowSeparator(boolean);
+ method public void setThemeId(int);
+ field public static final int PLAY_STATE_INITIAL = 0; // 0x0
+ field public static final int PLAY_STATE_PAUSED = 1; // 0x1
+ field public static final int PLAY_STATE_PLAYING = 2; // 0x2
+ }
+
+ public static class AbstractMediaItemPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
+ ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View!);
+ method public android.view.ViewGroup! getMediaItemActionsContainer();
+ method public android.view.View! getMediaItemDetailsView();
+ method public android.widget.TextView! getMediaItemDurationView();
+ method public android.widget.TextView! getMediaItemNameView();
+ method public android.widget.TextView! getMediaItemNumberView();
+ method public android.widget.ViewFlipper! getMediaItemNumberViewFlipper();
+ method public android.view.View! getMediaItemPausedView();
+ method public android.view.View! getMediaItemPlayingView();
+ method public androidx.leanback.widget.MultiActionsProvider.MultiAction[]! getMediaItemRowActions();
+ method public android.view.View! getMediaItemRowSeparator();
+ method public android.view.View! getSelectorView();
+ method public void notifyActionChanged(androidx.leanback.widget.MultiActionsProvider.MultiAction!);
+ method public void notifyDetailsChanged();
+ method public void notifyPlayStateChanged();
+ method public void onBindRowActions();
+ method public void setSelectedMediaItemNumberView(int);
+ }
+
+ public abstract class AbstractMediaListHeaderPresenter extends androidx.leanback.widget.RowPresenter {
+ ctor public AbstractMediaListHeaderPresenter(android.content.Context!, int);
+ ctor public AbstractMediaListHeaderPresenter();
+ method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method protected abstract void onBindMediaListHeaderViewHolder(androidx.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder!, Object!);
+ method public void setBackgroundColor(int);
+ }
+
+ public static class AbstractMediaListHeaderPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
+ ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View!);
+ method public android.widget.TextView! getHeaderView();
+ }
+
+ public class Action {
+ ctor public Action(long);
+ ctor public Action(long, CharSequence!);
+ ctor public Action(long, CharSequence!, CharSequence!);
+ ctor public Action(long, CharSequence!, CharSequence!, android.graphics.drawable.Drawable!);
+ method public final void addKeyCode(int);
+ method public final android.graphics.drawable.Drawable! getIcon();
+ method public final long getId();
+ method public final CharSequence! getLabel1();
+ method public final CharSequence! getLabel2();
+ method public final void removeKeyCode(int);
+ method public final boolean respondsToKeyCode(int);
+ method public final void setIcon(android.graphics.drawable.Drawable!);
+ method public final void setId(long);
+ method public final void setLabel1(CharSequence!);
+ method public final void setLabel2(CharSequence!);
+ field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+ }
+
+ public class ArrayObjectAdapter extends androidx.leanback.widget.ObjectAdapter {
+ ctor public ArrayObjectAdapter(androidx.leanback.widget.PresenterSelector!);
+ ctor public ArrayObjectAdapter(androidx.leanback.widget.Presenter!);
+ ctor public ArrayObjectAdapter();
+ method public void add(Object!);
+ method public void add(int, Object!);
+ method public void addAll(int, java.util.Collection!);
+ method public void clear();
+ method public Object! get(int);
+ method public int indexOf(Object!);
+ method public void move(int, int);
+ method public void notifyArrayItemRangeChanged(int, int);
+ method public boolean remove(Object!);
+ method public int removeItems(int, int);
+ method public void replace(int, Object!);
+ method public void setItems(java.util.List!, androidx.leanback.widget.DiffCallback!);
+ method public int size();
+ method public <E> java.util.List<E>! unmodifiableList();
+ }
+
+ public class BaseCardView extends android.widget.FrameLayout {
+ ctor public BaseCardView(android.content.Context!);
+ ctor public BaseCardView(android.content.Context!, android.util.AttributeSet!);
+ ctor public BaseCardView(android.content.Context!, android.util.AttributeSet!, int);
+ method protected androidx.leanback.widget.BaseCardView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.leanback.widget.BaseCardView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.leanback.widget.BaseCardView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public int getCardType();
+ method @Deprecated public int getExtraVisibility();
+ method public int getInfoVisibility();
+ method public boolean isSelectedAnimationDelayed();
+ method public void setCardType(int);
+ method @Deprecated public void setExtraVisibility(int);
+ method public void setInfoVisibility(int);
+ method public void setSelectedAnimationDelayed(boolean);
+ field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
+ field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
+ field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
+ field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
+ field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
+ field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
+ field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
+ }
+
+ public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+ ctor public BaseCardView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public BaseCardView.LayoutParams(int, int);
+ ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public BaseCardView.LayoutParams(androidx.leanback.widget.BaseCardView.LayoutParams!);
+ field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
+ field public static final int VIEW_TYPE_INFO = 1; // 0x1
+ field public static final int VIEW_TYPE_MAIN = 0; // 0x0
+ field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=androidx.leanback.widget.BaseCardView.LayoutParams.VIEW_TYPE_MAIN, to="MAIN"), @android.view.ViewDebug.IntToString(from=androidx.leanback.widget.BaseCardView.LayoutParams.VIEW_TYPE_INFO, to="INFO"), @android.view.ViewDebug.IntToString(from=androidx.leanback.widget.BaseCardView.LayoutParams.VIEW_TYPE_EXTRA, to="EXTRA")}) public int viewType;
+ }
+
+ public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
+ method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
+ method public void animateIn();
+ method public void animateOut();
+ method public int getChildDrawingOrder(int, int);
+ method @Deprecated public int getHorizontalMargin();
+ method public int getHorizontalSpacing();
+ method public int getInitialPrefetchItemCount();
+ method public int getItemAlignmentOffset();
+ method public float getItemAlignmentOffsetPercent();
+ method public int getItemAlignmentViewId();
+ method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener! getOnUnhandledKeyListener();
+ method public final int getSaveChildrenLimitNumber();
+ method public final int getSaveChildrenPolicy();
+ method public int getSelectedPosition();
+ method @Deprecated public int getVerticalMargin();
+ method public int getVerticalSpacing();
+ method public void getViewSelectedOffsets(android.view.View!, int[]!);
+ method public int getWindowAlignment();
+ method public int getWindowAlignmentOffset();
+ method public float getWindowAlignmentOffsetPercent();
+ method public boolean hasPreviousViewInSameRow(int);
+ method public boolean isChildLayoutAnimated();
+ method public boolean isFocusDrawingOrderEnabled();
+ method public final boolean isFocusSearchDisabled();
+ method public boolean isItemAlignmentOffsetWithPadding();
+ method public boolean isScrollEnabled();
+ method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+ method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+ method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
+ method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
+ method public void setAnimateChildLayout(boolean);
+ method public void setChildrenVisibility(int);
+ method public void setFocusDrawingOrderEnabled(boolean);
+ method public final void setFocusSearchDisabled(boolean);
+ method public void setGravity(int);
+ method public void setHasOverlappingRendering(boolean);
+ method @Deprecated public void setHorizontalMargin(int);
+ method public void setHorizontalSpacing(int);
+ method public void setInitialPrefetchItemCount(int);
+ method public void setItemAlignmentOffset(int);
+ method public void setItemAlignmentOffsetPercent(float);
+ method public void setItemAlignmentOffsetWithPadding(boolean);
+ method public void setItemAlignmentViewId(int);
+ method @Deprecated public void setItemMargin(int);
+ method public void setItemSpacing(int);
+ method public void setLayoutEnabled(boolean);
+ method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener!);
+ method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener!);
+ method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
+ method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener!);
+ method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener!);
+ method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener!);
+ method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener!);
+ method public void setPruneChild(boolean);
+ method public final void setSaveChildrenLimitNumber(int);
+ method public final void setSaveChildrenPolicy(int);
+ method public void setScrollEnabled(boolean);
+ method public void setSelectedPosition(int);
+ method public void setSelectedPosition(int, int);
+ method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask!);
+ method public void setSelectedPositionSmooth(int);
+ method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask!);
+ method @Deprecated public void setVerticalMargin(int);
+ method public void setVerticalSpacing(int);
+ method public void setWindowAlignment(int);
+ method public void setWindowAlignmentOffset(int);
+ method public void setWindowAlignmentOffsetPercent(float);
+ method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+ method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+ field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+ field public static final int SAVE_ALL_CHILD = 3; // 0x3
+ field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+ field public static final int SAVE_NO_CHILD = 0; // 0x0
+ field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+ field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+ field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+ field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+ field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+ field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+ }
+
+ public static interface BaseGridView.OnKeyInterceptListener {
+ method public boolean onInterceptKeyEvent(android.view.KeyEvent!);
+ }
+
+ public static interface BaseGridView.OnMotionInterceptListener {
+ method public boolean onInterceptMotionEvent(android.view.MotionEvent!);
+ }
+
+ public static interface BaseGridView.OnTouchInterceptListener {
+ method public boolean onInterceptTouchEvent(android.view.MotionEvent!);
+ }
+
+ public static interface BaseGridView.OnUnhandledKeyListener {
+ method public boolean onUnhandledKey(android.view.KeyEvent!);
+ }
+
+ public interface BaseOnItemViewClickedListener<T> {
+ method public void onItemClicked(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
+ }
+
+ public interface BaseOnItemViewSelectedListener<T> {
+ method public void onItemSelected(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
+ }
+
+ public class BrowseFrameLayout extends android.widget.FrameLayout {
+ ctor public BrowseFrameLayout(android.content.Context!);
+ ctor public BrowseFrameLayout(android.content.Context!, android.util.AttributeSet!);
+ ctor public BrowseFrameLayout(android.content.Context!, android.util.AttributeSet!, int);
+ method public androidx.leanback.widget.BrowseFrameLayout.OnChildFocusListener! getOnChildFocusListener();
+ method public androidx.leanback.widget.BrowseFrameLayout.OnFocusSearchListener! getOnFocusSearchListener();
+ method public void setOnChildFocusListener(androidx.leanback.widget.BrowseFrameLayout.OnChildFocusListener!);
+ method public void setOnDispatchKeyListener(android.view.View.OnKeyListener!);
+ method public void setOnFocusSearchListener(androidx.leanback.widget.BrowseFrameLayout.OnFocusSearchListener!);
+ }
+
+ public static interface BrowseFrameLayout.OnChildFocusListener {
+ method public void onRequestChildFocus(android.view.View!, android.view.View!);
+ method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
+ }
+
+ public static interface BrowseFrameLayout.OnFocusSearchListener {
+ method public android.view.View! onFocusSearch(android.view.View!, int);
+ }
+
+ public final class ClassPresenterSelector extends androidx.leanback.widget.PresenterSelector {
+ ctor public ClassPresenterSelector();
+ method public androidx.leanback.widget.ClassPresenterSelector! addClassPresenter(Class<?>!, androidx.leanback.widget.Presenter!);
+ method public androidx.leanback.widget.ClassPresenterSelector! addClassPresenterSelector(Class<?>!, androidx.leanback.widget.PresenterSelector!);
+ method public androidx.leanback.widget.Presenter! getPresenter(Object!);
+ }
+
+ public class ControlButtonPresenterSelector extends androidx.leanback.widget.PresenterSelector {
+ ctor public ControlButtonPresenterSelector();
+ method public androidx.leanback.widget.Presenter! getPresenter(Object!);
+ method public androidx.leanback.widget.Presenter! getPrimaryPresenter();
+ method public androidx.leanback.widget.Presenter! getSecondaryPresenter();
+ }
+
+ public class CursorObjectAdapter extends androidx.leanback.widget.ObjectAdapter {
+ ctor public CursorObjectAdapter(androidx.leanback.widget.PresenterSelector!);
+ ctor public CursorObjectAdapter(androidx.leanback.widget.Presenter!);
+ ctor public CursorObjectAdapter();
+ method public void changeCursor(android.database.Cursor!);
+ method public void close();
+ method public Object! get(int);
+ method public final android.database.Cursor! getCursor();
+ method public final androidx.leanback.database.CursorMapper! getMapper();
+ method protected final void invalidateCache(int);
+ method protected final void invalidateCache(int, int);
+ method public boolean isClosed();
+ method protected void onCursorChanged();
+ method protected void onMapperChanged();
+ method public final void setMapper(androidx.leanback.database.CursorMapper!);
+ method public int size();
+ method public android.database.Cursor! swapCursor(android.database.Cursor!);
+ }
+
+ public class DetailsOverviewLogoPresenter extends androidx.leanback.widget.Presenter {
+ ctor public DetailsOverviewLogoPresenter();
+ method public boolean isBoundToImage(androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder!, androidx.leanback.widget.DetailsOverviewRow!);
+ method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public android.view.View! onCreateView(android.view.ViewGroup!);
+ method public androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public void setContext(androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter!);
+ }
+
+ public static class DetailsOverviewLogoPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
+ ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View!);
+ method public androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter! getParentPresenter();
+ method public androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder! getParentViewHolder();
+ method public boolean isSizeFromDrawableIntrinsic();
+ method public void setSizeFromDrawableIntrinsic(boolean);
+ field protected androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter! mParentPresenter;
+ field protected androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder! mParentViewHolder;
+ }
+
+ public class DetailsOverviewRow extends androidx.leanback.widget.Row {
+ ctor public DetailsOverviewRow(Object!);
+ method @Deprecated public final void addAction(androidx.leanback.widget.Action!);
+ method @Deprecated public final void addAction(int, androidx.leanback.widget.Action!);
+ method public androidx.leanback.widget.Action! getActionForKeyCode(int);
+ method @Deprecated public final java.util.List<androidx.leanback.widget.Action>! getActions();
+ method public final androidx.leanback.widget.ObjectAdapter! getActionsAdapter();
+ method public final android.graphics.drawable.Drawable! getImageDrawable();
+ method public final Object! getItem();
+ method public boolean isImageScaleUpAllowed();
+ method @Deprecated public final boolean removeAction(androidx.leanback.widget.Action!);
+ method public final void setActionsAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public final void setImageBitmap(android.content.Context!, android.graphics.Bitmap!);
+ method public final void setImageDrawable(android.graphics.drawable.Drawable!);
+ method public void setImageScaleUpAllowed(boolean);
+ method public final void setItem(Object!);
+ }
+
+ public static class DetailsOverviewRow.Listener {
+ ctor public DetailsOverviewRow.Listener();
+ method public void onActionsAdapterChanged(androidx.leanback.widget.DetailsOverviewRow!);
+ method public void onImageDrawableChanged(androidx.leanback.widget.DetailsOverviewRow!);
+ method public void onItemChanged(androidx.leanback.widget.DetailsOverviewRow!);
+ }
+
+ @Deprecated public class DetailsOverviewRowPresenter extends androidx.leanback.widget.RowPresenter {
+ ctor @Deprecated public DetailsOverviewRowPresenter(androidx.leanback.widget.Presenter!);
+ method @Deprecated protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method @Deprecated @ColorInt public int getBackgroundColor();
+ method @Deprecated public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
+ method @Deprecated public boolean isStyleLarge();
+ method @Deprecated public final boolean isUsingDefaultSelectEffect();
+ method @Deprecated public void setBackgroundColor(@ColorInt int);
+ method @Deprecated public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
+ method @Deprecated public final void setSharedElementEnterTransition(android.app.Activity!, String!, long);
+ method @Deprecated public final void setSharedElementEnterTransition(android.app.Activity!, String!);
+ method @Deprecated public void setStyleLarge(boolean);
+ }
+
+ @Deprecated public final class DetailsOverviewRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
+ ctor @Deprecated public DetailsOverviewRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.Presenter!);
+ field @Deprecated public final androidx.leanback.widget.Presenter.ViewHolder! mDetailsDescriptionViewHolder;
+ }
+
+ public class DetailsParallax extends androidx.leanback.widget.RecyclerViewParallax {
+ ctor public DetailsParallax();
+ method public androidx.leanback.widget.Parallax.IntProperty! getOverviewRowBottom();
+ method public androidx.leanback.widget.Parallax.IntProperty! getOverviewRowTop();
+ }
+
+ public abstract class DiffCallback<Value> {
+ ctor public DiffCallback();
+ method public abstract boolean areContentsTheSame(Value, Value);
+ method public abstract boolean areItemsTheSame(Value, Value);
+ method public Object! getChangePayload(Value, Value);
+ }
+
+ public class DividerPresenter extends androidx.leanback.widget.Presenter {
+ ctor public DividerPresenter();
+ method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ }
+
+ public class DividerRow extends androidx.leanback.widget.Row {
+ ctor public DividerRow();
+ method public final boolean isRenderedAsRowView();
+ }
+
+ public interface FacetProvider {
+ method public Object! getFacet(Class<?>!);
+ }
+
+ public interface FacetProviderAdapter {
+ method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
+ }
+
+ public interface FocusHighlight {
+ field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
+ field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
+ field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
+ field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
+ field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
+ }
+
+ public class FocusHighlightHelper {
+ ctor @Deprecated public FocusHighlightHelper();
+ method public static void setupBrowseItemFocusHighlight(androidx.leanback.widget.ItemBridgeAdapter!, int, boolean);
+ method @Deprecated public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.VerticalGridView!);
+ method @Deprecated public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.VerticalGridView!, boolean);
+ method public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.ItemBridgeAdapter!);
+ method public static void setupHeaderItemFocusHighlight(androidx.leanback.widget.ItemBridgeAdapter!, boolean);
+ }
+
+ public interface FragmentAnimationProvider {
+ method public void onImeAppearing(java.util.List<android.animation.Animator>);
+ method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+ }
+
+ public class FullWidthDetailsOverviewRowPresenter extends androidx.leanback.widget.RowPresenter {
+ ctor public FullWidthDetailsOverviewRowPresenter(androidx.leanback.widget.Presenter!);
+ ctor public FullWidthDetailsOverviewRowPresenter(androidx.leanback.widget.Presenter!, androidx.leanback.widget.DetailsOverviewLogoPresenter!);
+ method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method public final int getActionsBackgroundColor();
+ method public final int getAlignmentMode();
+ method public final int getBackgroundColor();
+ method public final int getInitialState();
+ method protected int getLayoutResourceId();
+ method public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
+ method public final boolean isParticipatingEntranceTransition();
+ method public final boolean isUsingDefaultSelectEffect();
+ method public final void notifyOnBindLogo(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!);
+ method protected void onLayoutLogo(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, boolean);
+ method protected void onLayoutOverviewFrame(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int, boolean);
+ method protected void onStateChanged(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int);
+ method public final void setActionsBackgroundColor(int);
+ method public final void setAlignmentMode(int);
+ method public final void setBackgroundColor(int);
+ method public final void setInitialState(int);
+ method public final void setListener(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener!);
+ method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
+ method public final void setParticipatingEntranceTransition(boolean);
+ method public final void setState(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!, int);
+ field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
+ field public static final int ALIGN_MODE_START = 0; // 0x0
+ field public static final int STATE_FULL = 1; // 0x1
+ field public static final int STATE_HALF = 0; // 0x0
+ field public static final int STATE_SMALL = 2; // 0x2
+ field protected int mInitialState;
+ }
+
+ public abstract static class FullWidthDetailsOverviewRowPresenter.Listener {
+ ctor public FullWidthDetailsOverviewRowPresenter.Listener();
+ method public void onBindLogo(androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder!);
+ }
+
+ public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
+ ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.Presenter!, androidx.leanback.widget.DetailsOverviewLogoPresenter!);
+ method protected androidx.leanback.widget.DetailsOverviewRow.Listener! createRowListener();
+ method public final android.view.ViewGroup! getActionsRow();
+ method public final android.view.ViewGroup! getDetailsDescriptionFrame();
+ method public final androidx.leanback.widget.Presenter.ViewHolder! getDetailsDescriptionViewHolder();
+ method public final androidx.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder! getLogoViewHolder();
+ method public final android.view.ViewGroup! getOverviewView();
+ method public final int getState();
+ field protected final androidx.leanback.widget.DetailsOverviewRow.Listener! mRowListener;
+ }
+
+ public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends androidx.leanback.widget.DetailsOverviewRow.Listener {
+ ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
+ }
+
+ public class FullWidthDetailsOverviewSharedElementHelper extends androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
+ ctor public FullWidthDetailsOverviewSharedElementHelper();
+ method public boolean getAutoStartSharedElementTransition();
+ method public void setAutoStartSharedElementTransition(boolean);
+ method public void setSharedElementEnterTransition(android.app.Activity!, String!);
+ method public void setSharedElementEnterTransition(android.app.Activity!, String!, long);
+ method public void startPostponedEnterTransition();
+ }
+
+ public class GuidanceStylist implements androidx.leanback.widget.FragmentAnimationProvider {
+ ctor public GuidanceStylist();
+ method public android.widget.TextView! getBreadcrumbView();
+ method public android.widget.TextView! getDescriptionView();
+ method public android.widget.ImageView! getIconView();
+ method public android.widget.TextView! getTitleView();
+ method public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, androidx.leanback.widget.GuidanceStylist.Guidance!);
+ method public void onDestroyView();
+ method public void onImeAppearing(java.util.List<android.animation.Animator>);
+ method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+ method public int onProvideLayoutId();
+ }
+
+ public static class GuidanceStylist.Guidance {
+ ctor public GuidanceStylist.Guidance(String!, String!, String!, android.graphics.drawable.Drawable!);
+ method public String! getBreadcrumb();
+ method public String! getDescription();
+ method public android.graphics.drawable.Drawable! getIconDrawable();
+ method public String! getTitle();
+ }
+
+ public class GuidedAction extends androidx.leanback.widget.Action {
+ ctor protected GuidedAction();
+ method public String[]! getAutofillHints();
+ method public int getCheckSetId();
+ method public CharSequence! getDescription();
+ method public int getDescriptionEditInputType();
+ method public int getDescriptionInputType();
+ method public CharSequence! getEditDescription();
+ method public int getEditInputType();
+ method public CharSequence! getEditTitle();
+ method public int getInputType();
+ method public android.content.Intent! getIntent();
+ method public java.util.List<androidx.leanback.widget.GuidedAction>! getSubActions();
+ method public CharSequence! getTitle();
+ method public boolean hasEditableActivatorView();
+ method public boolean hasMultilineDescription();
+ method public boolean hasNext();
+ method public boolean hasSubActions();
+ method public boolean hasTextEditable();
+ method public boolean infoOnly();
+ method public final boolean isAutoSaveRestoreEnabled();
+ method public boolean isChecked();
+ method public boolean isDescriptionEditable();
+ method public boolean isEditTitleUsed();
+ method public boolean isEditable();
+ method public boolean isEnabled();
+ method public boolean isFocusable();
+ method public void onRestoreInstanceState(android.os.Bundle!, String!);
+ method public void onSaveInstanceState(android.os.Bundle!, String!);
+ method public void setChecked(boolean);
+ method public void setDescription(CharSequence!);
+ method public void setEditDescription(CharSequence!);
+ method public void setEditTitle(CharSequence!);
+ method public void setEnabled(boolean);
+ method public void setFocusable(boolean);
+ method public void setIntent(android.content.Intent!);
+ method public void setSubActions(java.util.List<androidx.leanback.widget.GuidedAction>!);
+ method public void setTitle(CharSequence!);
+ field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
+ field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
+ field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
+ field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
+ field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
+ field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
+ field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
+ field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
+ field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
+ field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
+ field public static final int NO_CHECK_SET = 0; // 0x0
+ }
+
+ public static class GuidedAction.Builder extends androidx.leanback.widget.GuidedAction.BuilderBase<androidx.leanback.widget.GuidedAction.Builder> {
+ ctor @Deprecated public GuidedAction.Builder();
+ ctor public GuidedAction.Builder(android.content.Context!);
+ method public androidx.leanback.widget.GuidedAction! build();
+ }
+
+ public abstract static class GuidedAction.BuilderBase<B extends androidx.leanback.widget.GuidedAction.BuilderBase> {
+ ctor public GuidedAction.BuilderBase(android.content.Context!);
+ method protected final void applyValues(androidx.leanback.widget.GuidedAction!);
+ method public B! autoSaveRestoreEnabled(boolean);
+ method public B! autofillHints(java.lang.String...!);
+ method public B! checkSetId(int);
+ method public B! checked(boolean);
+ method public B! clickAction(long);
+ method public B! description(CharSequence!);
+ method public B! description(@StringRes int);
+ method public B! descriptionEditInputType(int);
+ method public B! descriptionEditable(boolean);
+ method public B! descriptionInputType(int);
+ method public B! editDescription(CharSequence!);
+ method public B! editDescription(@StringRes int);
+ method public B! editInputType(int);
+ method public B! editTitle(CharSequence!);
+ method public B! editTitle(@StringRes int);
+ method public B! editable(boolean);
+ method public B! enabled(boolean);
+ method public B! focusable(boolean);
+ method public android.content.Context! getContext();
+ method public B! hasEditableActivatorView(boolean);
+ method public B! hasNext(boolean);
+ method public B! icon(android.graphics.drawable.Drawable!);
+ method public B! icon(@DrawableRes int);
+ method @Deprecated public B! iconResourceId(@DrawableRes int, android.content.Context!);
+ method public B! id(long);
+ method public B! infoOnly(boolean);
+ method public B! inputType(int);
+ method public B! intent(android.content.Intent!);
+ method public B! multilineDescription(boolean);
+ method public B! subActions(java.util.List<androidx.leanback.widget.GuidedAction>!);
+ method public B! title(CharSequence!);
+ method public B! title(@StringRes int);
+ }
+
+ public interface GuidedActionAutofillSupport {
+ method public void setOnAutofillListener(androidx.leanback.widget.GuidedActionAutofillSupport.OnAutofillListener!);
+ }
+
+ public static interface GuidedActionAutofillSupport.OnAutofillListener {
+ method public void onAutofill(android.view.View!);
+ }
+
+ public class GuidedActionDiffCallback extends androidx.leanback.widget.DiffCallback<androidx.leanback.widget.GuidedAction> {
+ ctor public GuidedActionDiffCallback();
+ method public boolean areContentsTheSame(androidx.leanback.widget.GuidedAction, androidx.leanback.widget.GuidedAction);
+ method public boolean areItemsTheSame(androidx.leanback.widget.GuidedAction, androidx.leanback.widget.GuidedAction);
+ method public static androidx.leanback.widget.GuidedActionDiffCallback! getInstance();
+ }
+
+ public class GuidedActionEditText extends android.widget.EditText implements androidx.leanback.widget.GuidedActionAutofillSupport androidx.leanback.widget.ImeKeyMonitor {
+ ctor public GuidedActionEditText(android.content.Context!);
+ ctor public GuidedActionEditText(android.content.Context!, android.util.AttributeSet!);
+ ctor public GuidedActionEditText(android.content.Context!, android.util.AttributeSet!, int);
+ method public void setImeKeyListener(androidx.leanback.widget.ImeKeyMonitor.ImeKeyListener!);
+ method public void setOnAutofillListener(androidx.leanback.widget.GuidedActionAutofillSupport.OnAutofillListener!);
+ }
+
+ public class GuidedActionsStylist implements androidx.leanback.widget.FragmentAnimationProvider {
+ ctor public GuidedActionsStylist();
+ method public void collapseAction(boolean);
+ method public void expandAction(androidx.leanback.widget.GuidedAction!, boolean);
+ method public androidx.leanback.widget.VerticalGridView! getActionsGridView();
+ method public androidx.leanback.widget.GuidedAction! getExpandedAction();
+ method public int getItemViewType(androidx.leanback.widget.GuidedAction!);
+ method public androidx.leanback.widget.VerticalGridView! getSubActionsGridView();
+ method public final boolean isBackKeyToCollapseActivatorView();
+ method public final boolean isBackKeyToCollapseSubActions();
+ method public boolean isButtonActions();
+ method public boolean isExpandTransitionSupported();
+ method public boolean isExpanded();
+ method public boolean isInExpandTransition();
+ method public boolean isSubActionsExpanded();
+ method public void onAnimateItemChecked(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean);
+ method public void onAnimateItemFocused(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean);
+ method public void onAnimateItemPressed(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean);
+ method public void onAnimateItemPressedCancelled(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
+ method public void onBindActivatorView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
+ method public void onBindCheckMarkView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
+ method public void onBindChevronView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
+ method public void onBindViewHolder(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
+ method public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!);
+ method public androidx.leanback.widget.GuidedActionsStylist.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method public androidx.leanback.widget.GuidedActionsStylist.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
+ method public void onDestroyView();
+ method @Deprecated protected void onEditingModeChange(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!, boolean);
+ method @CallSuper protected void onEditingModeChange(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, boolean, boolean);
+ method public void onImeAppearing(java.util.List<android.animation.Animator>);
+ method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+ method public int onProvideItemLayoutId();
+ method public int onProvideItemLayoutId(int);
+ method public int onProvideLayoutId();
+ method public boolean onUpdateActivatorView(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
+ method public void onUpdateExpandedViewHolder(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
+ method public void openInEditMode(androidx.leanback.widget.GuidedAction!);
+ method public void setAsButtonActions();
+ method public final void setBackKeyToCollapseActivatorView(boolean);
+ method public final void setBackKeyToCollapseSubActions(boolean);
+ method @Deprecated public void setEditingMode(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!, boolean);
+ method @Deprecated public void setExpandedViewHolder(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
+ method protected void setupImeOptions(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!, androidx.leanback.widget.GuidedAction!);
+ method @Deprecated public void startExpandedTransition(androidx.leanback.widget.GuidedActionsStylist.ViewHolder!);
+ field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
+ field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
+ }
+
+ public static class GuidedActionsStylist.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements androidx.leanback.widget.FacetProvider {
+ ctor public GuidedActionsStylist.ViewHolder(android.view.View!);
+ ctor public GuidedActionsStylist.ViewHolder(android.view.View!, boolean);
+ method public androidx.leanback.widget.GuidedAction! getAction();
+ method public android.widget.ImageView! getCheckmarkView();
+ method public android.widget.ImageView! getChevronView();
+ method public android.view.View! getContentView();
+ method public android.widget.TextView! getDescriptionView();
+ method public android.widget.EditText! getEditableDescriptionView();
+ method public android.widget.EditText! getEditableTitleView();
+ method public android.view.View! getEditingView();
+ method public Object! getFacet(Class<?>!);
+ method public android.widget.ImageView! getIconView();
+ method public android.widget.TextView! getTitleView();
+ method public boolean isInEditing();
+ method public boolean isInEditingActivatorView();
+ method public boolean isInEditingDescription();
+ method public boolean isInEditingText();
+ method public boolean isInEditingTitle();
+ method public boolean isSubAction();
+ }
+
+ public class GuidedDatePickerAction extends androidx.leanback.widget.GuidedAction {
+ ctor public GuidedDatePickerAction();
+ method public long getDate();
+ method public String! getDatePickerFormat();
+ method public long getMaxDate();
+ method public long getMinDate();
+ method public void setDate(long);
+ }
+
+ public static final class GuidedDatePickerAction.Builder extends androidx.leanback.widget.GuidedDatePickerAction.BuilderBase<androidx.leanback.widget.GuidedDatePickerAction.Builder> {
+ ctor public GuidedDatePickerAction.Builder(android.content.Context!);
+ method public androidx.leanback.widget.GuidedDatePickerAction! build();
+ }
+
+ public abstract static class GuidedDatePickerAction.BuilderBase<B extends androidx.leanback.widget.GuidedDatePickerAction.BuilderBase> extends androidx.leanback.widget.GuidedAction.BuilderBase<B> {
+ ctor public GuidedDatePickerAction.BuilderBase(android.content.Context!);
+ method protected final void applyDatePickerValues(androidx.leanback.widget.GuidedDatePickerAction!);
+ method public B! date(long);
+ method public B! datePickerFormat(String!);
+ method public B! maxDate(long);
+ method public B! minDate(long);
+ }
+
+ public class HeaderItem {
+ ctor public HeaderItem(long, String!);
+ ctor public HeaderItem(String!);
+ method public CharSequence! getContentDescription();
+ method public CharSequence! getDescription();
+ method public final long getId();
+ method public final String! getName();
+ method public void setContentDescription(CharSequence!);
+ method public void setDescription(CharSequence!);
+ }
+
+ public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
+ ctor public HorizontalGridView(android.content.Context!);
+ ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!);
+ ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!, int);
+ method public final boolean getFadingLeftEdge();
+ method public final int getFadingLeftEdgeLength();
+ method public final int getFadingLeftEdgeOffset();
+ method public final boolean getFadingRightEdge();
+ method public final int getFadingRightEdgeLength();
+ method public final int getFadingRightEdgeOffset();
+ method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
+ method public final void setFadingLeftEdge(boolean);
+ method public final void setFadingLeftEdgeLength(int);
+ method public final void setFadingLeftEdgeOffset(int);
+ method public final void setFadingRightEdge(boolean);
+ method public final void setFadingRightEdgeLength(int);
+ method public final void setFadingRightEdgeOffset(int);
+ method public void setNumRows(int);
+ method public void setRowHeight(int);
+ }
+
+ public final class HorizontalHoverCardSwitcher extends androidx.leanback.widget.PresenterSwitcher {
+ ctor public HorizontalHoverCardSwitcher();
+ method protected void insertView(android.view.View!);
+ method public void select(androidx.leanback.widget.HorizontalGridView!, android.view.View!, Object!);
+ }
+
+ public class ImageCardView extends androidx.leanback.widget.BaseCardView {
+ ctor @Deprecated public ImageCardView(android.content.Context!, int);
+ ctor public ImageCardView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public ImageCardView(android.content.Context!);
+ ctor public ImageCardView(android.content.Context!, android.util.AttributeSet!);
+ method public android.graphics.drawable.Drawable! getBadgeImage();
+ method public CharSequence! getContentText();
+ method public android.graphics.drawable.Drawable! getInfoAreaBackground();
+ method public android.graphics.drawable.Drawable! getMainImage();
+ method public final android.widget.ImageView! getMainImageView();
+ method public CharSequence! getTitleText();
+ method public void setBadgeImage(android.graphics.drawable.Drawable!);
+ method public void setContentText(CharSequence!);
+ method public void setInfoAreaBackground(android.graphics.drawable.Drawable!);
+ method public void setInfoAreaBackgroundColor(@ColorInt int);
+ method public void setMainImage(android.graphics.drawable.Drawable!);
+ method public void setMainImage(android.graphics.drawable.Drawable!, boolean);
+ method public void setMainImageAdjustViewBounds(boolean);
+ method public void setMainImageDimensions(int, int);
+ method public void setMainImageScaleType(android.widget.ImageView.ScaleType!);
+ method public void setTitleText(CharSequence!);
+ field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
+ field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
+ field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
+ field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
+ field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
+ }
+
+ public interface ImeKeyMonitor {
+ method public void setImeKeyListener(androidx.leanback.widget.ImeKeyMonitor.ImeKeyListener!);
+ }
+
+ public static interface ImeKeyMonitor.ImeKeyListener {
+ method public boolean onKeyPreIme(android.widget.EditText!, int, android.view.KeyEvent!);
+ }
+
+ public final class ItemAlignmentFacet {
+ ctor public ItemAlignmentFacet();
+ method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]! getAlignmentDefs();
+ method public boolean isMultiAlignment();
+ method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]!);
+ field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+ }
+
+ public static class ItemAlignmentFacet.ItemAlignmentDef {
+ ctor public ItemAlignmentFacet.ItemAlignmentDef();
+ method public final int getItemAlignmentFocusViewId();
+ method public final int getItemAlignmentOffset();
+ method public final float getItemAlignmentOffsetPercent();
+ method public final int getItemAlignmentViewId();
+ method public boolean isAlignedToTextViewBaseLine();
+ method public final boolean isItemAlignmentOffsetWithPadding();
+ method public final void setAlignedToTextViewBaseline(boolean);
+ method public final void setItemAlignmentFocusViewId(int);
+ method public final void setItemAlignmentOffset(int);
+ method public final void setItemAlignmentOffsetPercent(float);
+ method public final void setItemAlignmentOffsetWithPadding(boolean);
+ method public final void setItemAlignmentViewId(int);
+ }
+
+ public class ItemBridgeAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter implements androidx.leanback.widget.FacetProviderAdapter {
+ ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!, androidx.leanback.widget.PresenterSelector!);
+ ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!);
+ ctor public ItemBridgeAdapter();
+ method public void clear();
+ method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
+ method public int getItemCount();
+ method public java.util.ArrayList<androidx.leanback.widget.Presenter>! getPresenterMapper();
+ method public androidx.leanback.widget.ItemBridgeAdapter.Wrapper! getWrapper();
+ method protected void onAddPresenter(androidx.leanback.widget.Presenter!, int);
+ method protected void onAttachedToWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method protected void onBind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public final void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int);
+ method public final void onBindViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, java.util.List!);
+ method protected void onCreate(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public final androidx.recyclerview.widget.RecyclerView.ViewHolder! onCreateViewHolder(android.view.ViewGroup!, int);
+ method protected void onDetachedFromWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public final boolean onFailedToRecycleView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method protected void onUnbind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public final void onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void onViewDetachedFromWindow(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void setAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public void setAdapterListener(androidx.leanback.widget.ItemBridgeAdapter.AdapterListener!);
+ method public void setPresenter(androidx.leanback.widget.PresenterSelector!);
+ method public void setPresenterMapper(java.util.ArrayList<androidx.leanback.widget.Presenter>!);
+ method public void setWrapper(androidx.leanback.widget.ItemBridgeAdapter.Wrapper!);
+ }
+
+ public static class ItemBridgeAdapter.AdapterListener {
+ ctor public ItemBridgeAdapter.AdapterListener();
+ method public void onAddPresenter(androidx.leanback.widget.Presenter!, int);
+ method public void onAttachedToWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public void onBind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public void onBind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!, java.util.List!);
+ method public void onCreate(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public void onDetachedFromWindow(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ method public void onUnbind(androidx.leanback.widget.ItemBridgeAdapter.ViewHolder!);
+ }
+
+ public class ItemBridgeAdapter.ViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder implements androidx.leanback.widget.FacetProvider {
+ method public final Object! getExtraObject();
+ method public Object! getFacet(Class<?>!);
+ method public final Object! getItem();
+ method public final androidx.leanback.widget.Presenter! getPresenter();
+ method public final androidx.leanback.widget.Presenter.ViewHolder! getViewHolder();
+ method public void setExtraObject(Object!);
+ }
+
+ public abstract static class ItemBridgeAdapter.Wrapper {
+ ctor public ItemBridgeAdapter.Wrapper();
+ method public abstract android.view.View! createWrapper(android.view.View!);
+ method public abstract void wrap(android.view.View!, android.view.View!);
+ }
+
+ public class ItemBridgeAdapterShadowOverlayWrapper extends androidx.leanback.widget.ItemBridgeAdapter.Wrapper {
+ ctor public ItemBridgeAdapterShadowOverlayWrapper(androidx.leanback.widget.ShadowOverlayHelper!);
+ method public android.view.View! createWrapper(android.view.View!);
+ method public void wrap(android.view.View!, android.view.View!);
+ }
+
+ public class ListRow extends androidx.leanback.widget.Row {
+ ctor public ListRow(androidx.leanback.widget.HeaderItem!, androidx.leanback.widget.ObjectAdapter!);
+ ctor public ListRow(long, androidx.leanback.widget.HeaderItem!, androidx.leanback.widget.ObjectAdapter!);
+ ctor public ListRow(androidx.leanback.widget.ObjectAdapter!);
+ method public final androidx.leanback.widget.ObjectAdapter! getAdapter();
+ method public CharSequence! getContentDescription();
+ method public void setContentDescription(CharSequence!);
+ }
+
+ public final class ListRowHoverCardView extends android.widget.LinearLayout {
+ ctor public ListRowHoverCardView(android.content.Context!);
+ ctor public ListRowHoverCardView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ListRowHoverCardView(android.content.Context!, android.util.AttributeSet!, int);
+ method public CharSequence! getDescription();
+ method public CharSequence! getTitle();
+ method public void setDescription(CharSequence!);
+ method public void setTitle(CharSequence!);
+ }
+
+ public class ListRowPresenter extends androidx.leanback.widget.RowPresenter {
+ ctor public ListRowPresenter();
+ ctor public ListRowPresenter(int);
+ ctor public ListRowPresenter(int, boolean);
+ method protected void applySelectLevelToChild(androidx.leanback.widget.ListRowPresenter.ViewHolder!, android.view.View!);
+ method public final boolean areChildRoundedCornersEnabled();
+ method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method protected androidx.leanback.widget.ShadowOverlayHelper.Options! createShadowOverlayOptions();
+ method public final void enableChildRoundedCorners(boolean);
+ method public int getExpandedRowHeight();
+ method public final int getFocusZoomFactor();
+ method public final androidx.leanback.widget.PresenterSelector! getHoverCardPresenterSelector();
+ method public int getRecycledPoolSize(androidx.leanback.widget.Presenter!);
+ method public int getRowHeight();
+ method public final boolean getShadowEnabled();
+ method @Deprecated public final int getZoomFactor();
+ method public final boolean isFocusDimmerUsed();
+ method public final boolean isKeepChildForeground();
+ method public boolean isUsingDefaultListSelectEffect();
+ method public final boolean isUsingDefaultSelectEffect();
+ method public boolean isUsingDefaultShadow();
+ method public boolean isUsingOutlineClipping(android.content.Context!);
+ method public boolean isUsingZOrder(android.content.Context!);
+ method public void setExpandedRowHeight(int);
+ method public final void setHoverCardPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method public final void setKeepChildForeground(boolean);
+ method public void setNumRows(int);
+ method public void setRecycledPoolSize(androidx.leanback.widget.Presenter!, int);
+ method public void setRowHeight(int);
+ method public final void setShadowEnabled(boolean);
+ }
+
+ public static class ListRowPresenter.SelectItemViewHolderTask extends androidx.leanback.widget.Presenter.ViewHolderTask {
+ ctor public ListRowPresenter.SelectItemViewHolderTask(int);
+ method public int getItemPosition();
+ method public androidx.leanback.widget.Presenter.ViewHolderTask! getItemTask();
+ method public boolean isSmoothScroll();
+ method public void setItemPosition(int);
+ method public void setItemTask(androidx.leanback.widget.Presenter.ViewHolderTask!);
+ method public void setSmoothScroll(boolean);
+ }
+
+ public static class ListRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
+ ctor public ListRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.HorizontalGridView!, androidx.leanback.widget.ListRowPresenter!);
+ method public final androidx.leanback.widget.ItemBridgeAdapter! getBridgeAdapter();
+ method public final androidx.leanback.widget.HorizontalGridView! getGridView();
+ method public androidx.leanback.widget.Presenter.ViewHolder! getItemViewHolder(int);
+ method public final androidx.leanback.widget.ListRowPresenter! getListRowPresenter();
+ method public int getSelectedPosition();
+ }
+
+ public final class ListRowView extends android.widget.LinearLayout {
+ ctor public ListRowView(android.content.Context!);
+ ctor public ListRowView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ListRowView(android.content.Context!, android.util.AttributeSet!, int);
+ method public androidx.leanback.widget.HorizontalGridView! getGridView();
+ }
+
+ public interface MultiActionsProvider {
+ method public androidx.leanback.widget.MultiActionsProvider.MultiAction[]! getActions();
+ }
+
+ public static class MultiActionsProvider.MultiAction {
+ ctor public MultiActionsProvider.MultiAction(long);
+ method public android.graphics.drawable.Drawable! getCurrentDrawable();
+ method public android.graphics.drawable.Drawable[]! getDrawables();
+ method public long getId();
+ method public int getIndex();
+ method public void incrementIndex();
+ method public void setDrawables(android.graphics.drawable.Drawable[]!);
+ method public void setIndex(int);
+ }
+
+ public abstract class ObjectAdapter {
+ ctor public ObjectAdapter(androidx.leanback.widget.PresenterSelector!);
+ ctor public ObjectAdapter(androidx.leanback.widget.Presenter!);
+ ctor public ObjectAdapter();
+ method public abstract Object! get(int);
+ method public long getId(int);
+ method public final androidx.leanback.widget.Presenter! getPresenter(Object!);
+ method public final androidx.leanback.widget.PresenterSelector! getPresenterSelector();
+ method public final boolean hasStableIds();
+ method public boolean isImmediateNotifySupported();
+ method protected final void notifyChanged();
+ method protected final void notifyItemMoved(int, int);
+ method public final void notifyItemRangeChanged(int, int);
+ method public final void notifyItemRangeChanged(int, int, Object!);
+ method protected final void notifyItemRangeInserted(int, int);
+ method protected final void notifyItemRangeRemoved(int, int);
+ method protected void onHasStableIdsChanged();
+ method protected void onPresenterSelectorChanged();
+ method public final void registerObserver(androidx.leanback.widget.ObjectAdapter.DataObserver!);
+ method public final void setHasStableIds(boolean);
+ method public final void setPresenterSelector(androidx.leanback.widget.PresenterSelector!);
+ method public abstract int size();
+ method public final void unregisterAllObservers();
+ method public final void unregisterObserver(androidx.leanback.widget.ObjectAdapter.DataObserver!);
+ field public static final int NO_ID = -1; // 0xffffffff
+ }
+
+ public abstract static class ObjectAdapter.DataObserver {
+ ctor public ObjectAdapter.DataObserver();
+ method public void onChanged();
+ method public void onItemMoved(int, int);
+ method public void onItemRangeChanged(int, int);
+ method public void onItemRangeChanged(int, int, Object!);
+ method public void onItemRangeInserted(int, int);
+ method public void onItemRangeRemoved(int, int);
+ }
+
+ public interface OnActionClickedListener {
+ method public void onActionClicked(androidx.leanback.widget.Action!);
+ }
+
+ public interface OnChildLaidOutListener {
+ method public void onChildLaidOut(android.view.ViewGroup!, android.view.View!, int, long);
+ }
+
+ @Deprecated public interface OnChildSelectedListener {
+ method @Deprecated public void onChildSelected(android.view.ViewGroup!, android.view.View!, int, long);
+ }
+
+ public abstract class OnChildViewHolderSelectedListener {
+ ctor public OnChildViewHolderSelectedListener();
+ method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
+ method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
+ }
+
+ public interface OnItemViewClickedListener extends androidx.leanback.widget.BaseOnItemViewClickedListener<androidx.leanback.widget.Row> {
+ }
+
+ public interface OnItemViewSelectedListener extends androidx.leanback.widget.BaseOnItemViewSelectedListener<androidx.leanback.widget.Row> {
+ }
+
+ public class PageRow extends androidx.leanback.widget.Row {
+ ctor public PageRow(androidx.leanback.widget.HeaderItem!);
+ method public final boolean isRenderedAsRowView();
+ }
+
+ public abstract class Parallax<PropertyT extends android.util.Property> {
+ ctor public Parallax();
+ method public androidx.leanback.widget.ParallaxEffect! addEffect(androidx.leanback.widget.Parallax.PropertyMarkerValue...!);
+ method public final PropertyT! addProperty(String!);
+ method public abstract PropertyT! createProperty(String!, int);
+ method public java.util.List<androidx.leanback.widget.ParallaxEffect>! getEffects();
+ method public abstract float getMaxValue();
+ method public final java.util.List<PropertyT>! getProperties();
+ method public void removeAllEffects();
+ method public void removeEffect(androidx.leanback.widget.ParallaxEffect!);
+ method @CallSuper public void updateValues();
+ }
+
+ public static class Parallax.FloatProperty extends android.util.Property<androidx.leanback.widget.Parallax,java.lang.Float> {
+ ctor public Parallax.FloatProperty(String!, int);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! at(float, float);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atAbsolute(float);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atFraction(float);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMax();
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMin();
+ method public final Float! get(androidx.leanback.widget.Parallax!);
+ method public final int getIndex();
+ method public final float getValue(androidx.leanback.widget.Parallax!);
+ method public final void set(androidx.leanback.widget.Parallax!, Float!);
+ method public final void setValue(androidx.leanback.widget.Parallax!, float);
+ field public static final float UNKNOWN_AFTER = 3.4028235E38f;
+ field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
+ }
+
+ public static class Parallax.IntProperty extends android.util.Property<androidx.leanback.widget.Parallax,java.lang.Integer> {
+ ctor public Parallax.IntProperty(String!, int);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! at(int, float);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atAbsolute(int);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atFraction(float);
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMax();
+ method public final androidx.leanback.widget.Parallax.PropertyMarkerValue! atMin();
+ method public final Integer! get(androidx.leanback.widget.Parallax!);
+ method public final int getIndex();
+ method public final int getValue(androidx.leanback.widget.Parallax!);
+ method public final void set(androidx.leanback.widget.Parallax!, Integer!);
+ method public final void setValue(androidx.leanback.widget.Parallax!, int);
+ field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
+ field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
+ }
+
+ public static class Parallax.PropertyMarkerValue<PropertyT> {
+ ctor public Parallax.PropertyMarkerValue(PropertyT!);
+ method public PropertyT! getProperty();
+ }
+
+ public abstract class ParallaxEffect {
+ method public final void addTarget(androidx.leanback.widget.ParallaxTarget!);
+ method public final java.util.List<androidx.leanback.widget.Parallax.PropertyMarkerValue>! getPropertyRanges();
+ method public final java.util.List<androidx.leanback.widget.ParallaxTarget>! getTargets();
+ method public final void performMapping(androidx.leanback.widget.Parallax!);
+ method public final void removeTarget(androidx.leanback.widget.ParallaxTarget!);
+ method public final void setPropertyRanges(androidx.leanback.widget.Parallax.PropertyMarkerValue...!);
+ method public final androidx.leanback.widget.ParallaxEffect! target(androidx.leanback.widget.ParallaxTarget!);
+ method public final androidx.leanback.widget.ParallaxEffect! target(Object!, android.animation.PropertyValuesHolder!);
+ method public final <T, V extends java.lang.Number> androidx.leanback.widget.ParallaxEffect! target(T!, android.util.Property<T,V>!);
+ }
+
+ public abstract class ParallaxTarget {
+ ctor public ParallaxTarget();
+ method public void directUpdate(Number!);
+ method public boolean isDirectMapping();
+ method public void update(float);
+ }
+
+ public static final class ParallaxTarget.DirectPropertyTarget<T extends java.lang.Object, V extends java.lang.Number> extends androidx.leanback.widget.ParallaxTarget {
+ ctor public ParallaxTarget.DirectPropertyTarget(Object!, android.util.Property<T,V>!);
+ }
+
+ public static final class ParallaxTarget.PropertyValuesHolderTarget extends androidx.leanback.widget.ParallaxTarget {
+ ctor public ParallaxTarget.PropertyValuesHolderTarget(Object!, android.animation.PropertyValuesHolder!);
+ }
+
+ public class PlaybackControlsRow extends androidx.leanback.widget.Row {
+ ctor public PlaybackControlsRow(Object!);
+ ctor public PlaybackControlsRow();
+ method public androidx.leanback.widget.Action! getActionForKeyCode(int);
+ method public androidx.leanback.widget.Action! getActionForKeyCode(androidx.leanback.widget.ObjectAdapter!, int);
+ method public long getBufferedPosition();
+ method @Deprecated public int getBufferedProgress();
+ method @Deprecated public long getBufferedProgressLong();
+ method public long getCurrentPosition();
+ method @Deprecated public int getCurrentTime();
+ method @Deprecated public long getCurrentTimeLong();
+ method public long getDuration();
+ method public final android.graphics.drawable.Drawable! getImageDrawable();
+ method public final Object! getItem();
+ method public final androidx.leanback.widget.ObjectAdapter! getPrimaryActionsAdapter();
+ method public final androidx.leanback.widget.ObjectAdapter! getSecondaryActionsAdapter();
+ method @Deprecated public int getTotalTime();
+ method @Deprecated public long getTotalTimeLong();
+ method public void setBufferedPosition(long);
+ method @Deprecated public void setBufferedProgress(int);
+ method @Deprecated public void setBufferedProgressLong(long);
+ method public void setCurrentPosition(long);
+ method @Deprecated public void setCurrentTime(int);
+ method @Deprecated public void setCurrentTimeLong(long);
+ method public void setDuration(long);
+ method public final void setImageBitmap(android.content.Context!, android.graphics.Bitmap!);
+ method public final void setImageDrawable(android.graphics.drawable.Drawable!);
+ method public void setOnPlaybackProgressChangedListener(androidx.leanback.widget.PlaybackControlsRow.OnPlaybackProgressCallback!);
+ method public final void setPrimaryActionsAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method public final void setSecondaryActionsAdapter(androidx.leanback.widget.ObjectAdapter!);
+ method @Deprecated public void setTotalTime(int);
+ method @Deprecated public void setTotalTimeLong(long);
+ }
+
+ public static class PlaybackControlsRow.ClosedCaptioningAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context!);
+ ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context!, int);
+ field public static final int INDEX_OFF = 0; // 0x0
+ field public static final int INDEX_ON = 1; // 0x1
+ field @Deprecated public static final int OFF = 0; // 0x0
+ field @Deprecated public static final int ON = 1; // 0x1
+ }
+
+ public static class PlaybackControlsRow.FastForwardAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.FastForwardAction(android.content.Context!);
+ ctor public PlaybackControlsRow.FastForwardAction(android.content.Context!, int);
+ }
+
+ public static class PlaybackControlsRow.HighQualityAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.HighQualityAction(android.content.Context!);
+ ctor public PlaybackControlsRow.HighQualityAction(android.content.Context!, int);
+ field public static final int INDEX_OFF = 0; // 0x0
+ field public static final int INDEX_ON = 1; // 0x1
+ field @Deprecated public static final int OFF = 0; // 0x0
+ field @Deprecated public static final int ON = 1; // 0x1
+ }
+
+ public static class PlaybackControlsRow.MoreActions extends androidx.leanback.widget.Action {
+ ctor public PlaybackControlsRow.MoreActions(android.content.Context!);
+ }
+
+ public abstract static class PlaybackControlsRow.MultiAction extends androidx.leanback.widget.Action {
+ ctor public PlaybackControlsRow.MultiAction(int);
+ method public int getActionCount();
+ method public android.graphics.drawable.Drawable! getDrawable(int);
+ method public int getIndex();
+ method public String! getLabel(int);
+ method public String! getSecondaryLabel(int);
+ method public void nextIndex();
+ method public void setDrawables(android.graphics.drawable.Drawable[]!);
+ method public void setIndex(int);
+ method public void setLabels(String[]!);
+ method public void setSecondaryLabels(String[]!);
+ }
+
+ public static class PlaybackControlsRow.OnPlaybackProgressCallback {
+ ctor public PlaybackControlsRow.OnPlaybackProgressCallback();
+ method public void onBufferedPositionChanged(androidx.leanback.widget.PlaybackControlsRow!, long);
+ method public void onCurrentPositionChanged(androidx.leanback.widget.PlaybackControlsRow!, long);
+ method public void onDurationChanged(androidx.leanback.widget.PlaybackControlsRow!, long);
+ }
+
+ public static class PlaybackControlsRow.PictureInPictureAction extends androidx.leanback.widget.Action {
+ ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context!);
+ }
+
+ public static class PlaybackControlsRow.PlayPauseAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context!);
+ field public static final int INDEX_PAUSE = 1; // 0x1
+ field public static final int INDEX_PLAY = 0; // 0x0
+ field @Deprecated public static final int PAUSE = 1; // 0x1
+ field @Deprecated public static final int PLAY = 0; // 0x0
+ }
+
+ public static class PlaybackControlsRow.RepeatAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.RepeatAction(android.content.Context!);
+ ctor public PlaybackControlsRow.RepeatAction(android.content.Context!, int);
+ ctor public PlaybackControlsRow.RepeatAction(android.content.Context!, int, int);
+ field @Deprecated public static final int ALL = 1; // 0x1
+ field public static final int INDEX_ALL = 1; // 0x1
+ field public static final int INDEX_NONE = 0; // 0x0
+ field public static final int INDEX_ONE = 2; // 0x2
+ field @Deprecated public static final int NONE = 0; // 0x0
+ field @Deprecated public static final int ONE = 2; // 0x2
+ }
+
+ public static class PlaybackControlsRow.RewindAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.RewindAction(android.content.Context!);
+ ctor public PlaybackControlsRow.RewindAction(android.content.Context!, int);
+ }
+
+ public static class PlaybackControlsRow.ShuffleAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.ShuffleAction(android.content.Context!);
+ ctor public PlaybackControlsRow.ShuffleAction(android.content.Context!, int);
+ field public static final int INDEX_OFF = 0; // 0x0
+ field public static final int INDEX_ON = 1; // 0x1
+ field @Deprecated public static final int OFF = 0; // 0x0
+ field @Deprecated public static final int ON = 1; // 0x1
+ }
+
+ public static class PlaybackControlsRow.SkipNextAction extends androidx.leanback.widget.Action {
+ ctor public PlaybackControlsRow.SkipNextAction(android.content.Context!);
+ }
+
+ public static class PlaybackControlsRow.SkipPreviousAction extends androidx.leanback.widget.Action {
+ ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context!);
+ }
+
+ public abstract static class PlaybackControlsRow.ThumbsAction extends androidx.leanback.widget.PlaybackControlsRow.MultiAction {
+ ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context!, int, int);
+ field public static final int INDEX_OUTLINE = 1; // 0x1
+ field public static final int INDEX_SOLID = 0; // 0x0
+ field @Deprecated public static final int OUTLINE = 1; // 0x1
+ field @Deprecated public static final int SOLID = 0; // 0x0
+ }
+
+ public static class PlaybackControlsRow.ThumbsDownAction extends androidx.leanback.widget.PlaybackControlsRow.ThumbsAction {
+ ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context!);
+ }
+
+ public static class PlaybackControlsRow.ThumbsUpAction extends androidx.leanback.widget.PlaybackControlsRow.ThumbsAction {
+ ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context!);
+ }
+
+ public class PlaybackControlsRowPresenter extends androidx.leanback.widget.PlaybackRowPresenter {
+ ctor public PlaybackControlsRowPresenter(androidx.leanback.widget.Presenter!);
+ ctor public PlaybackControlsRowPresenter();
+ method public boolean areSecondaryActionsHidden();
+ method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method @ColorInt public int getBackgroundColor();
+ method public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
+ method @ColorInt public int getProgressColor();
+ method public void setBackgroundColor(@ColorInt int);
+ method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
+ method public void setProgressColor(@ColorInt int);
+ method public void setSecondaryActionsHidden(boolean);
+ method public void showBottomSpace(androidx.leanback.widget.PlaybackControlsRowPresenter.ViewHolder!, boolean);
+ method public void showPrimaryActions(androidx.leanback.widget.PlaybackControlsRowPresenter.ViewHolder!);
+ }
+
+ public class PlaybackControlsRowPresenter.ViewHolder extends androidx.leanback.widget.PlaybackRowPresenter.ViewHolder {
+ field public final androidx.leanback.widget.Presenter.ViewHolder! mDescriptionViewHolder;
+ }
+
+ public abstract class PlaybackRowPresenter extends androidx.leanback.widget.RowPresenter {
+ ctor public PlaybackRowPresenter();
+ method public void onReappear(androidx.leanback.widget.RowPresenter.ViewHolder!);
+ }
+
+ public static class PlaybackRowPresenter.ViewHolder extends androidx.leanback.widget.RowPresenter.ViewHolder {
+ ctor public PlaybackRowPresenter.ViewHolder(android.view.View!);
+ }
+
+ public class PlaybackSeekDataProvider {
+ ctor public PlaybackSeekDataProvider();
+ method public long[]! getSeekPositions();
+ method public void getThumbnail(int, androidx.leanback.widget.PlaybackSeekDataProvider.ResultCallback!);
+ method public void reset();
+ }
+
+ public static class PlaybackSeekDataProvider.ResultCallback {
+ ctor public PlaybackSeekDataProvider.ResultCallback();
+ method public void onThumbnailLoaded(android.graphics.Bitmap!, int);
+ }
+
+ public interface PlaybackSeekUi {
+ method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
+ }
+
+ public static class PlaybackSeekUi.Client {
+ ctor public PlaybackSeekUi.Client();
+ method public androidx.leanback.widget.PlaybackSeekDataProvider! getPlaybackSeekDataProvider();
+ method public boolean isSeekEnabled();
+ method public void onSeekFinished(boolean);
+ method public void onSeekPositionChanged(long);
+ method public void onSeekStarted();
+ }
+
+ public class PlaybackTransportRowPresenter extends androidx.leanback.widget.PlaybackRowPresenter {
+ ctor public PlaybackTransportRowPresenter();
+ method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method public float getDefaultSeekIncrement();
+ method public androidx.leanback.widget.OnActionClickedListener! getOnActionClickedListener();
+ method @ColorInt public int getProgressColor();
+ method @ColorInt public int getSecondaryProgressColor();
+ method protected void onProgressBarClicked(androidx.leanback.widget.PlaybackTransportRowPresenter.ViewHolder!);
+ method public void setDefaultSeekIncrement(float);
+ method public void setDescriptionPresenter(androidx.leanback.widget.Presenter!);
+ method public void setOnActionClickedListener(androidx.leanback.widget.OnActionClickedListener!);
+ method public void setProgressColor(@ColorInt int);
+ method public void setSecondaryProgressColor(@ColorInt int);
+ }
+
+ public class PlaybackTransportRowPresenter.ViewHolder extends androidx.leanback.widget.PlaybackRowPresenter.ViewHolder implements androidx.leanback.widget.PlaybackSeekUi {
+ ctor public PlaybackTransportRowPresenter.ViewHolder(android.view.View!, androidx.leanback.widget.Presenter!);
+ method public final android.widget.TextView! getCurrentPositionView();
+ method public final androidx.leanback.widget.Presenter.ViewHolder! getDescriptionViewHolder();
+ method public final android.widget.TextView! getDurationView();
+ method protected void onSetCurrentPositionLabel(long);
+ method protected void onSetDurationLabel(long);
+ method public void setPlaybackSeekUiClient(androidx.leanback.widget.PlaybackSeekUi.Client!);
+ }
+
+ public abstract class Presenter implements androidx.leanback.widget.FacetProvider {
+ ctor public Presenter();
+ method protected static void cancelAnimationsRecursive(android.view.View!);
+ method public final Object! getFacet(Class<?>!);
+ method public abstract void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!, java.util.List<java.lang.Object>!);
+ method public abstract androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method public abstract void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public void onViewAttachedToWindow(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public void onViewDetachedFromWindow(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public final void setFacet(Class<?>!, Object!);
+ method public void setOnClickListener(androidx.leanback.widget.Presenter.ViewHolder!, android.view.View.OnClickListener!);
+ }
+
+ public static class Presenter.ViewHolder implements androidx.leanback.widget.FacetProvider {
+ ctor public Presenter.ViewHolder(android.view.View!);
+ method public final Object! getFacet(Class<?>!);
+ method public final void setFacet(Class<?>!, Object!);
+ field public final android.view.View! view;
+ }
+
+ public abstract static class Presenter.ViewHolderTask {
+ ctor public Presenter.ViewHolderTask();
+ method public void run(androidx.leanback.widget.Presenter.ViewHolder!);
+ }
+
+ public abstract class PresenterSelector {
+ ctor public PresenterSelector();
+ method public abstract androidx.leanback.widget.Presenter! getPresenter(Object!);
+ method public androidx.leanback.widget.Presenter[]! getPresenters();
+ }
+
+ public abstract class PresenterSwitcher {
+ ctor public PresenterSwitcher();
+ method public void clear();
+ method public final android.view.ViewGroup! getParentViewGroup();
+ method public void init(android.view.ViewGroup!, androidx.leanback.widget.PresenterSelector!);
+ method protected abstract void insertView(android.view.View!);
+ method protected void onViewSelected(android.view.View!);
+ method public void select(Object!);
+ method protected void showView(android.view.View!, boolean);
+ method public void unselect();
+ }
+
+ public class RecyclerViewParallax extends androidx.leanback.widget.Parallax<androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty> {
+ ctor public RecyclerViewParallax();
+ method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! createProperty(String!, int);
+ method public float getMaxValue();
+ method public androidx.recyclerview.widget.RecyclerView! getRecyclerView();
+ method public void setRecyclerView(androidx.recyclerview.widget.RecyclerView!);
+ }
+
+ public static final class RecyclerViewParallax.ChildPositionProperty extends androidx.leanback.widget.Parallax.IntProperty {
+ method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! adapterPosition(int);
+ method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! fraction(float);
+ method public int getAdapterPosition();
+ method public float getFraction();
+ method public int getOffset();
+ method public int getViewId();
+ method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! offset(int);
+ method public androidx.leanback.widget.RecyclerViewParallax.ChildPositionProperty! viewId(int);
+ }
+
+ public class Row {
+ ctor public Row(long, androidx.leanback.widget.HeaderItem!);
+ ctor public Row(androidx.leanback.widget.HeaderItem!);
+ ctor public Row();
+ method public final androidx.leanback.widget.HeaderItem! getHeaderItem();
+ method public final long getId();
+ method public boolean isRenderedAsRowView();
+ method public final void setHeaderItem(androidx.leanback.widget.HeaderItem!);
+ method public final void setId(long);
+ }
+
+ public class RowHeaderPresenter extends androidx.leanback.widget.Presenter {
+ ctor public RowHeaderPresenter();
+ method protected static float getFontDescent(android.widget.TextView!, android.graphics.Paint!);
+ method public int getSpaceUnderBaseline(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!);
+ method public boolean isNullItemVisibilityGone();
+ method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method protected void onSelectLevelChanged(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!);
+ method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public void setNullItemVisibilityGone(boolean);
+ method public final void setSelectLevel(androidx.leanback.widget.RowHeaderPresenter.ViewHolder!, float);
+ }
+
+ public static class RowHeaderPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
+ ctor public RowHeaderPresenter.ViewHolder(android.view.View!);
+ method public final float getSelectLevel();
+ }
+
+ public final class RowHeaderView extends android.widget.TextView {
+ ctor public RowHeaderView(android.content.Context!);
+ ctor public RowHeaderView(android.content.Context!, android.util.AttributeSet!);
+ ctor public RowHeaderView(android.content.Context!, android.util.AttributeSet!, int);
+ }
+
+ public abstract class RowPresenter extends androidx.leanback.widget.Presenter {
+ ctor public RowPresenter();
+ method protected abstract androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
+ method protected void dispatchItemSelectedListener(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
+ method public void freeze(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
+ method public final androidx.leanback.widget.RowHeaderPresenter! getHeaderPresenter();
+ method public final androidx.leanback.widget.RowPresenter.ViewHolder! getRowViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public final boolean getSelectEffectEnabled();
+ method public final float getSelectLevel(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public final int getSyncActivatePolicy();
+ method protected void initializeRowViewHolder(androidx.leanback.widget.RowPresenter.ViewHolder!);
+ method protected boolean isClippingChildren();
+ method public boolean isUsingDefaultSelectEffect();
+ method protected void onBindRowViewHolder(androidx.leanback.widget.RowPresenter.ViewHolder!, Object!);
+ method public final void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public final androidx.leanback.widget.Presenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method protected void onRowViewAttachedToWindow(androidx.leanback.widget.RowPresenter.ViewHolder!);
+ method protected void onRowViewDetachedFromWindow(androidx.leanback.widget.RowPresenter.ViewHolder!);
+ method protected void onRowViewExpanded(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
+ method protected void onRowViewSelected(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
+ method protected void onSelectLevelChanged(androidx.leanback.widget.RowPresenter.ViewHolder!);
+ method protected void onUnbindRowViewHolder(androidx.leanback.widget.RowPresenter.ViewHolder!);
+ method public final void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public final void onViewAttachedToWindow(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public final void onViewDetachedFromWindow(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public void setEntranceTransitionState(androidx.leanback.widget.RowPresenter.ViewHolder!, boolean);
+ method public final void setHeaderPresenter(androidx.leanback.widget.RowHeaderPresenter!);
+ method public final void setRowViewExpanded(androidx.leanback.widget.Presenter.ViewHolder!, boolean);
+ method public final void setRowViewSelected(androidx.leanback.widget.Presenter.ViewHolder!, boolean);
+ method public final void setSelectEffectEnabled(boolean);
+ method public final void setSelectLevel(androidx.leanback.widget.Presenter.ViewHolder!, float);
+ method public final void setSyncActivatePolicy(int);
+ field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
+ field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
+ field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
+ field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
+ }
+
+ public static class RowPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
+ ctor public RowPresenter.ViewHolder(android.view.View!);
+ method public final androidx.leanback.widget.RowHeaderPresenter.ViewHolder! getHeaderViewHolder();
+ method public final androidx.leanback.widget.BaseOnItemViewClickedListener! getOnItemViewClickedListener();
+ method public final androidx.leanback.widget.BaseOnItemViewSelectedListener! getOnItemViewSelectedListener();
+ method public android.view.View.OnKeyListener! getOnKeyListener();
+ method public final androidx.leanback.widget.Row! getRow();
+ method public final Object! getRowObject();
+ method public final float getSelectLevel();
+ method public Object! getSelectedItem();
+ method public androidx.leanback.widget.Presenter.ViewHolder! getSelectedItemViewHolder();
+ method public final boolean isExpanded();
+ method public final boolean isSelected();
+ method public final void setActivated(boolean);
+ method public final void setOnItemViewClickedListener(androidx.leanback.widget.BaseOnItemViewClickedListener!);
+ method public final void setOnItemViewSelectedListener(androidx.leanback.widget.BaseOnItemViewSelectedListener!);
+ method public void setOnKeyListener(android.view.View.OnKeyListener!);
+ method public final void syncActivatedStatus(android.view.View!);
+ field protected final androidx.leanback.graphics.ColorOverlayDimmer! mColorDimmer;
+ }
+
+ public class SearchBar extends android.widget.RelativeLayout {
+ ctor public SearchBar(android.content.Context!);
+ ctor public SearchBar(android.content.Context!, android.util.AttributeSet!);
+ ctor public SearchBar(android.content.Context!, android.util.AttributeSet!, int);
+ method public void displayCompletions(java.util.List<java.lang.String>!);
+ method public void displayCompletions(android.view.inputmethod.CompletionInfo[]!);
+ method public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method public CharSequence! getHint();
+ method public String! getTitle();
+ method public boolean isRecognizing();
+ method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method public void setPermissionListener(androidx.leanback.widget.SearchBar.SearchBarPermissionListener!);
+ method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setSearchAffordanceColorsInListening(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setSearchBarListener(androidx.leanback.widget.SearchBar.SearchBarListener!);
+ method public void setSearchQuery(String!);
+ method @Deprecated public void setSpeechRecognitionCallback(androidx.leanback.widget.SpeechRecognitionCallback!);
+ method public void setSpeechRecognizer(android.speech.SpeechRecognizer!);
+ method public void setTitle(String!);
+ method public void startRecognition();
+ method public void stopRecognition();
+ }
+
+ public static interface SearchBar.SearchBarListener {
+ method public void onKeyboardDismiss(String!);
+ method public void onSearchQueryChange(String!);
+ method public void onSearchQuerySubmit(String!);
+ }
+
+ public static interface SearchBar.SearchBarPermissionListener {
+ method public void requestAudioPermission();
+ }
+
+ public class SearchEditText extends android.widget.EditText {
+ ctor public SearchEditText(android.content.Context!);
+ ctor public SearchEditText(android.content.Context!, android.util.AttributeSet!);
+ ctor public SearchEditText(android.content.Context!, android.util.AttributeSet!, int);
+ method public static boolean isLayoutRtl(android.view.View!);
+ method public void reset();
+ method public void setFinalRecognizedText(CharSequence!);
+ method public void setOnKeyboardDismissListener(androidx.leanback.widget.SearchEditText.OnKeyboardDismissListener!);
+ method public void updateRecognizedText(String!, String!);
+ method public void updateRecognizedText(String!, java.util.List<java.lang.Float>!);
+ }
+
+ public static interface SearchEditText.OnKeyboardDismissListener {
+ method public void onKeyboardDismiss();
+ }
+
+ public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
+ ctor public SearchOrbView(android.content.Context!);
+ ctor public SearchOrbView(android.content.Context!, android.util.AttributeSet!);
+ ctor public SearchOrbView(android.content.Context!, android.util.AttributeSet!, int);
+ method public void enableOrbColorAnimation(boolean);
+ method @ColorInt public int getOrbColor();
+ method public androidx.leanback.widget.SearchOrbView.Colors! getOrbColors();
+ method public android.graphics.drawable.Drawable! getOrbIcon();
+ method public void onClick(android.view.View!);
+ method public void setOnOrbClickedListener(android.view.View.OnClickListener!);
+ method public void setOrbColor(int);
+ method @Deprecated public void setOrbColor(@ColorInt int, @ColorInt int);
+ method public void setOrbColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setOrbIcon(android.graphics.drawable.Drawable!);
+ }
+
+ public static class SearchOrbView.Colors {
+ ctor public SearchOrbView.Colors(@ColorInt int);
+ ctor public SearchOrbView.Colors(@ColorInt int, @ColorInt int);
+ ctor public SearchOrbView.Colors(@ColorInt int, @ColorInt int, @ColorInt int);
+ method public static int getBrightColor(int);
+ field @ColorInt public int brightColor;
+ field @ColorInt public int color;
+ field @ColorInt public int iconColor;
+ }
+
+ public class SectionRow extends androidx.leanback.widget.Row {
+ ctor public SectionRow(androidx.leanback.widget.HeaderItem!);
+ ctor public SectionRow(long, String!);
+ ctor public SectionRow(String!);
+ method public final boolean isRenderedAsRowView();
+ }
+
+ public class ShadowOverlayContainer extends android.widget.FrameLayout {
+ ctor public ShadowOverlayContainer(android.content.Context!);
+ ctor public ShadowOverlayContainer(android.content.Context!, android.util.AttributeSet!);
+ ctor public ShadowOverlayContainer(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getShadowType();
+ method public android.view.View! getWrappedView();
+ method @Deprecated public void initialize(boolean, boolean);
+ method @Deprecated public void initialize(boolean, boolean, boolean);
+ method public static void prepareParentForShadow(android.view.ViewGroup!);
+ method public void setOverlayColor(@ColorInt int);
+ method public void setShadowFocusLevel(float);
+ method public static boolean supportsDynamicShadow();
+ method public static boolean supportsShadow();
+ method public void useDynamicShadow();
+ method public void useDynamicShadow(float, float);
+ method public void useStaticShadow();
+ method public void wrap(android.view.View!);
+ field public static final int SHADOW_DYNAMIC = 3; // 0x3
+ field public static final int SHADOW_NONE = 1; // 0x1
+ field public static final int SHADOW_STATIC = 2; // 0x2
+ }
+
+ public final class ShadowOverlayHelper {
+ method public androidx.leanback.widget.ShadowOverlayContainer! createShadowOverlayContainer(android.content.Context!);
+ method public int getShadowType();
+ method public boolean needsOverlay();
+ method public boolean needsRoundedCorner();
+ method public boolean needsWrapper();
+ method public void onViewCreated(android.view.View!);
+ method public void prepareParentForShadow(android.view.ViewGroup!);
+ method public static void setNoneWrapperOverlayColor(android.view.View!, int);
+ method public static void setNoneWrapperShadowFocusLevel(android.view.View!, float);
+ method public void setOverlayColor(android.view.View!, int);
+ method public void setShadowFocusLevel(android.view.View!, float);
+ method public static boolean supportsDynamicShadow();
+ method public static boolean supportsForeground();
+ method public static boolean supportsRoundedCorner();
+ method public static boolean supportsShadow();
+ field public static final int SHADOW_DYNAMIC = 3; // 0x3
+ field public static final int SHADOW_NONE = 1; // 0x1
+ field public static final int SHADOW_STATIC = 2; // 0x2
+ }
+
+ public static final class ShadowOverlayHelper.Builder {
+ ctor public ShadowOverlayHelper.Builder();
+ method public androidx.leanback.widget.ShadowOverlayHelper! build(android.content.Context!);
+ method public androidx.leanback.widget.ShadowOverlayHelper.Builder! keepForegroundDrawable(boolean);
+ method public androidx.leanback.widget.ShadowOverlayHelper.Builder! needsOverlay(boolean);
+ method public androidx.leanback.widget.ShadowOverlayHelper.Builder! needsRoundedCorner(boolean);
+ method public androidx.leanback.widget.ShadowOverlayHelper.Builder! needsShadow(boolean);
+ method public androidx.leanback.widget.ShadowOverlayHelper.Builder! options(androidx.leanback.widget.ShadowOverlayHelper.Options!);
+ method public androidx.leanback.widget.ShadowOverlayHelper.Builder! preferZOrder(boolean);
+ }
+
+ public static final class ShadowOverlayHelper.Options {
+ ctor public ShadowOverlayHelper.Options();
+ method public androidx.leanback.widget.ShadowOverlayHelper.Options! dynamicShadowZ(float, float);
+ method public float getDynamicShadowFocusedZ();
+ method public float getDynamicShadowUnfocusedZ();
+ method public int getRoundedCornerRadius();
+ method public androidx.leanback.widget.ShadowOverlayHelper.Options! roundedCornerRadius(int);
+ field public static final androidx.leanback.widget.ShadowOverlayHelper.Options! DEFAULT;
+ }
+
+ public final class SinglePresenterSelector extends androidx.leanback.widget.PresenterSelector {
+ ctor public SinglePresenterSelector(androidx.leanback.widget.Presenter!);
+ method public androidx.leanback.widget.Presenter! getPresenter(Object!);
+ }
+
+ public class SparseArrayObjectAdapter extends androidx.leanback.widget.ObjectAdapter {
+ ctor public SparseArrayObjectAdapter(androidx.leanback.widget.PresenterSelector!);
+ ctor public SparseArrayObjectAdapter(androidx.leanback.widget.Presenter!);
+ ctor public SparseArrayObjectAdapter();
+ method public void clear(int);
+ method public void clear();
+ method public Object! get(int);
+ method public int indexOf(Object!);
+ method public int indexOf(int);
+ method public Object! lookup(int);
+ method public void notifyArrayItemRangeChanged(int, int);
+ method public void set(int, Object!);
+ method public int size();
+ }
+
+ public class SpeechOrbView extends androidx.leanback.widget.SearchOrbView {
+ ctor public SpeechOrbView(android.content.Context!);
+ ctor public SpeechOrbView(android.content.Context!, android.util.AttributeSet!);
+ ctor public SpeechOrbView(android.content.Context!, android.util.AttributeSet!, int);
+ method public void setListeningOrbColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setNotListeningOrbColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setSoundLevel(int);
+ method public void showListening();
+ method public void showNotListening();
+ }
+
+ @Deprecated public interface SpeechRecognitionCallback {
+ method @Deprecated public void recognizeSpeech();
+ }
+
+ public class TitleHelper {
+ ctor public TitleHelper(android.view.ViewGroup!, android.view.View!);
+ method public androidx.leanback.widget.BrowseFrameLayout.OnFocusSearchListener! getOnFocusSearchListener();
+ method public android.view.ViewGroup! getSceneRoot();
+ method public android.view.View! getTitleView();
+ method public void showTitle(boolean);
+ }
+
+ public class TitleView extends android.widget.FrameLayout implements androidx.leanback.widget.TitleViewAdapter.Provider {
+ ctor public TitleView(android.content.Context!);
+ ctor public TitleView(android.content.Context!, android.util.AttributeSet!);
+ ctor public TitleView(android.content.Context!, android.util.AttributeSet!, int);
+ method public void enableAnimation(boolean);
+ method public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
+ method public android.view.View! getSearchAffordanceView();
+ method public CharSequence! getTitle();
+ method public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
+ method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method public void setOnSearchClickedListener(android.view.View.OnClickListener!);
+ method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setTitle(CharSequence!);
+ method public void updateComponentsVisibility(int);
+ }
+
+ public abstract class TitleViewAdapter {
+ ctor public TitleViewAdapter();
+ method public android.graphics.drawable.Drawable! getBadgeDrawable();
+ method public androidx.leanback.widget.SearchOrbView.Colors! getSearchAffordanceColors();
+ method public abstract android.view.View! getSearchAffordanceView();
+ method public CharSequence! getTitle();
+ method public void setAnimationEnabled(boolean);
+ method public void setBadgeDrawable(android.graphics.drawable.Drawable!);
+ method public void setOnSearchClickedListener(android.view.View.OnClickListener!);
+ method public void setSearchAffordanceColors(androidx.leanback.widget.SearchOrbView.Colors!);
+ method public void setTitle(CharSequence!);
+ method public void updateComponentsVisibility(int);
+ field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
+ field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
+ field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
+ }
+
+ public static interface TitleViewAdapter.Provider {
+ method public androidx.leanback.widget.TitleViewAdapter! getTitleViewAdapter();
+ }
+
+ public class VerticalGridPresenter extends androidx.leanback.widget.Presenter {
+ ctor public VerticalGridPresenter();
+ ctor public VerticalGridPresenter(int);
+ ctor public VerticalGridPresenter(int, boolean);
+ method public final boolean areChildRoundedCornersEnabled();
+ method protected androidx.leanback.widget.VerticalGridPresenter.ViewHolder! createGridViewHolder(android.view.ViewGroup!);
+ method protected androidx.leanback.widget.ShadowOverlayHelper.Options! createShadowOverlayOptions();
+ method public final void enableChildRoundedCorners(boolean);
+ method public final int getFocusZoomFactor();
+ method public final boolean getKeepChildForeground();
+ method public int getNumberOfColumns();
+ method public final androidx.leanback.widget.OnItemViewClickedListener! getOnItemViewClickedListener();
+ method public final androidx.leanback.widget.OnItemViewSelectedListener! getOnItemViewSelectedListener();
+ method public final boolean getShadowEnabled();
+ method protected void initializeGridViewHolder(androidx.leanback.widget.VerticalGridPresenter.ViewHolder!);
+ method public final boolean isFocusDimmerUsed();
+ method public boolean isUsingDefaultShadow();
+ method public boolean isUsingZOrder(android.content.Context!);
+ method public void onBindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!, Object!);
+ method public final androidx.leanback.widget.VerticalGridPresenter.ViewHolder! onCreateViewHolder(android.view.ViewGroup!);
+ method public void onUnbindViewHolder(androidx.leanback.widget.Presenter.ViewHolder!);
+ method public void setEntranceTransitionState(androidx.leanback.widget.VerticalGridPresenter.ViewHolder!, boolean);
+ method public final void setKeepChildForeground(boolean);
+ method public void setNumberOfColumns(int);
+ method public final void setOnItemViewClickedListener(androidx.leanback.widget.OnItemViewClickedListener!);
+ method public final void setOnItemViewSelectedListener(androidx.leanback.widget.OnItemViewSelectedListener!);
+ method public final void setShadowEnabled(boolean);
+ }
+
+ public static class VerticalGridPresenter.ViewHolder extends androidx.leanback.widget.Presenter.ViewHolder {
+ ctor public VerticalGridPresenter.ViewHolder(androidx.leanback.widget.VerticalGridView!);
+ method public androidx.leanback.widget.VerticalGridView! getGridView();
+ }
+
+ public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
+ ctor public VerticalGridView(android.content.Context!);
+ ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!);
+ ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!, int);
+ method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
+ method public void setColumnWidth(int);
+ method public void setNumColumns(int);
+ }
+
+ public interface ViewHolderTask {
+ method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ }
+
+}
+
+package androidx.leanback.widget.picker {
+
+ public class DatePicker extends androidx.leanback.widget.picker.Picker {
+ ctor public DatePicker(android.content.Context!, android.util.AttributeSet!);
+ ctor public DatePicker(android.content.Context!, android.util.AttributeSet!, int);
+ method public long getDate();
+ method public String! getDatePickerFormat();
+ method public long getMaxDate();
+ method public long getMinDate();
+ method public final void onColumnValueChanged(int, int);
+ method public void setDate(long);
+ method public void setDate(int, int, int, boolean);
+ method public void setDatePickerFormat(String!);
+ method public void setMaxDate(long);
+ method public void setMinDate(long);
+ }
+
+ public class Picker extends android.widget.FrameLayout {
+ ctor public Picker(android.content.Context!, android.util.AttributeSet!);
+ ctor public Picker(android.content.Context!, android.util.AttributeSet!, int);
+ method public void addOnValueChangedListener(androidx.leanback.widget.picker.Picker.PickerValueListener!);
+ method public float getActivatedVisibleItemCount();
+ method public androidx.leanback.widget.picker.PickerColumn! getColumnAt(int);
+ method public int getColumnsCount();
+ method protected int getPickerItemHeightPixels();
+ method @LayoutRes public final int getPickerItemLayoutId();
+ method @IdRes public final int getPickerItemTextViewId();
+ method public int getSelectedColumn();
+ method @Deprecated public final CharSequence! getSeparator();
+ method public final java.util.List<java.lang.CharSequence>! getSeparators();
+ method public float getVisibleItemCount();
+ method public void onColumnValueChanged(int, int);
+ method public void removeOnValueChangedListener(androidx.leanback.widget.picker.Picker.PickerValueListener!);
+ method public void setActivatedVisibleItemCount(float);
+ method public void setColumnAt(int, androidx.leanback.widget.picker.PickerColumn!);
+ method public void setColumnValue(int, int, boolean);
+ method public void setColumns(java.util.List<androidx.leanback.widget.picker.PickerColumn>!);
+ method public final void setPickerItemLayoutId(@LayoutRes int);
+ method public final void setPickerItemTextViewId(@IdRes int);
+ method public void setSelectedColumn(int);
+ method public final void setSeparator(CharSequence!);
+ method public final void setSeparators(java.util.List<java.lang.CharSequence>!);
+ method public void setVisibleItemCount(float);
+ }
+
+ public static interface Picker.PickerValueListener {
+ method public void onValueChanged(androidx.leanback.widget.picker.Picker!, int);
+ }
+
+ public class PickerColumn {
+ ctor public PickerColumn();
+ method public int getCount();
+ method public int getCurrentValue();
+ method public CharSequence! getLabelFor(int);
+ method public String! getLabelFormat();
+ method public int getMaxValue();
+ method public int getMinValue();
+ method public CharSequence[]! getStaticLabels();
+ method public void setCurrentValue(int);
+ method public void setLabelFormat(String!);
+ method public void setMaxValue(int);
+ method public void setMinValue(int);
+ method public void setStaticLabels(CharSequence[]!);
+ }
+
+ public class PinPicker extends androidx.leanback.widget.picker.Picker {
+ ctor public PinPicker(android.content.Context!, android.util.AttributeSet!);
+ ctor public PinPicker(android.content.Context!, android.util.AttributeSet!, int);
+ method public String! getPin();
+ method public void resetPin();
+ method public void setNumberOfColumns(int);
+ }
+
+ public class TimePicker extends androidx.leanback.widget.picker.Picker {
+ ctor public TimePicker(android.content.Context!, android.util.AttributeSet!);
+ ctor public TimePicker(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getHour();
+ method public int getMinute();
+ method public boolean is24Hour();
+ method public boolean isPm();
+ method public void setHour(@IntRange(from=0, to=23) int);
+ method public void setIs24Hour(boolean);
+ method public void setMinute(@IntRange(from=0, to=59) int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/leanback/api/res-1.1.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to leanback/api/res-1.1.0-alpha02.txt
diff --git a/leanback/api21/androidx/leanback/transition/FadeAndShortSlide.java b/leanback/api21/androidx/leanback/transition/FadeAndShortSlide.java
index f197c57..29a290b 100644
--- a/leanback/api21/androidx/leanback/transition/FadeAndShortSlide.java
+++ b/leanback/api21/androidx/leanback/transition/FadeAndShortSlide.java
@@ -15,7 +15,7 @@
*/
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -42,7 +42,7 @@
* @hide
*/
@RequiresApi(21)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class FadeAndShortSlide extends Visibility {
private static final TimeInterpolator sDecelerate = new DecelerateInterpolator();
diff --git a/leanback/api21/androidx/leanback/transition/SlideNoPropagation.java b/leanback/api21/androidx/leanback/transition/SlideNoPropagation.java
index 3ff7847..a10a0cc 100644
--- a/leanback/api21/androidx/leanback/transition/SlideNoPropagation.java
+++ b/leanback/api21/androidx/leanback/transition/SlideNoPropagation.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.transition.Slide;
@@ -26,7 +26,7 @@
* @hide
*/
@RequiresApi(21)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class SlideNoPropagation extends Slide {
public SlideNoPropagation() {
diff --git a/leanback/api21/androidx/leanback/transition/TranslationAnimationCreator.java b/leanback/api21/androidx/leanback/transition/TranslationAnimationCreator.java
index 455a60d..4dd2597 100644
--- a/leanback/api21/androidx/leanback/transition/TranslationAnimationCreator.java
+++ b/leanback/api21/androidx/leanback/transition/TranslationAnimationCreator.java
@@ -1,6 +1,6 @@
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -23,7 +23,7 @@
* @hide
*/
@RequiresApi(21)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class TranslationAnimationCreator {
/**
diff --git a/leanback/build.gradle b/leanback/build.gradle
index b8fcf67..e9cf2a8 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -7,8 +7,9 @@
}
dependencies {
+ api(project(":annotation"))
api("androidx.interpolator:interpolator:1.0.0")
- api("androidx.core:core:1.0.0")
+ api(project(":core"))
implementation("androidx.collection:collection:1.0.0")
api("androidx.media:media:1.0.0")
api("androidx.fragment:fragment:1.0.0")
diff --git a/leanback/common/androidx/leanback/transition/TransitionListener.java b/leanback/common/androidx/leanback/transition/TransitionListener.java
index da91d8b..838fafc 100644
--- a/leanback/common/androidx/leanback/transition/TransitionListener.java
+++ b/leanback/common/androidx/leanback/transition/TransitionListener.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -21,7 +21,7 @@
* Listeners for transition start and stop.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TransitionListener {
protected Object mImpl;
diff --git a/leanback/src/main/java/androidx/leanback/animation/LogAccelerateInterpolator.java b/leanback/src/main/java/androidx/leanback/animation/LogAccelerateInterpolator.java
index 3816087..284815a 100644
--- a/leanback/src/main/java/androidx/leanback/animation/LogAccelerateInterpolator.java
+++ b/leanback/src/main/java/androidx/leanback/animation/LogAccelerateInterpolator.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.animation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.TimeInterpolator;
@@ -22,7 +22,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class LogAccelerateInterpolator implements TimeInterpolator {
int mBase;
diff --git a/leanback/src/main/java/androidx/leanback/animation/LogDecelerateInterpolator.java b/leanback/src/main/java/androidx/leanback/animation/LogDecelerateInterpolator.java
index 383814a..d13ac78 100644
--- a/leanback/src/main/java/androidx/leanback/animation/LogDecelerateInterpolator.java
+++ b/leanback/src/main/java/androidx/leanback/animation/LogDecelerateInterpolator.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.animation;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.TimeInterpolator;
@@ -22,7 +22,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class LogDecelerateInterpolator implements TimeInterpolator {
int mBase;
diff --git a/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java b/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java
index 87d73ab..d02edee 100644
--- a/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java
+++ b/leanback/src/main/java/androidx/leanback/app/BackgroundFragment.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Fragment;
@@ -23,7 +23,7 @@
* Fragment used by the background manager.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class BackgroundFragment extends Fragment {
private BackgroundManager mBackgroundManager;
diff --git a/leanback/src/main/java/androidx/leanback/app/GuidedStepFragment.java b/leanback/src/main/java/androidx/leanback/app/GuidedStepFragment.java
index ec1a131..27b3d99 100644
--- a/leanback/src/main/java/androidx/leanback/app/GuidedStepFragment.java
+++ b/leanback/src/main/java/androidx/leanback/app/GuidedStepFragment.java
@@ -16,7 +16,7 @@
*/
package androidx.leanback.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -231,14 +231,14 @@
* Animation to slide the contents from the side (left/right).
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int SLIDE_FROM_SIDE = 0;
/**
* Animation to slide the contents from the bottom.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int SLIDE_FROM_BOTTOM = 1;
private static final String TAG = "GuidedStepF";
@@ -247,7 +247,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class DummyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -1348,7 +1348,7 @@
* For now clients(subclasses) can call this method inside the constructor.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setEntranceTransitionType(int transitionType) {
this.entranceTransitionType = transitionType;
}
diff --git a/leanback/src/main/java/androidx/leanback/app/GuidedStepSupportFragment.java b/leanback/src/main/java/androidx/leanback/app/GuidedStepSupportFragment.java
index fe94957..c82116f 100644
--- a/leanback/src/main/java/androidx/leanback/app/GuidedStepSupportFragment.java
+++ b/leanback/src/main/java/androidx/leanback/app/GuidedStepSupportFragment.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -226,14 +226,14 @@
* Animation to slide the contents from the side (left/right).
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int SLIDE_FROM_SIDE = 0;
/**
* Animation to slide the contents from the bottom.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int SLIDE_FROM_BOTTOM = 1;
private static final String TAG = "GuidedStepF";
@@ -242,7 +242,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class DummyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -1343,7 +1343,7 @@
* For now clients(subclasses) can call this method inside the constructor.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setEntranceTransitionType(int transitionType) {
this.entranceTransitionType = transitionType;
}
diff --git a/leanback/src/main/java/androidx/leanback/app/PermissionHelper.java b/leanback/src/main/java/androidx/leanback/app/PermissionHelper.java
index a7e56bb..cd32e18 100644
--- a/leanback/src/main/java/androidx/leanback/app/PermissionHelper.java
+++ b/leanback/src/main/java/androidx/leanback/app/PermissionHelper.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Build;
@@ -22,7 +22,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class PermissionHelper {
public static void requestPermissions(android.app.Fragment fragment, String[] permissions,
diff --git a/leanback/src/main/java/androidx/leanback/media/MediaPlayerGlue.java b/leanback/src/main/java/androidx/leanback/media/MediaPlayerGlue.java
index 02d159b..b8fd5e6 100644
--- a/leanback/src/main/java/androidx/leanback/media/MediaPlayerGlue.java
+++ b/leanback/src/main/java/androidx/leanback/media/MediaPlayerGlue.java
@@ -55,7 +55,7 @@
* @deprecated Use {@link MediaPlayerAdapter} with {@link PlaybackTransportControlGlue} or
* {@link PlaybackBannerControlGlue}.
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Deprecated
public class MediaPlayerGlue extends PlaybackControlGlue implements
OnItemViewSelectedListener {
diff --git a/leanback/src/main/java/androidx/leanback/media/PlaybackBannerControlGlue.java b/leanback/src/main/java/androidx/leanback/media/PlaybackBannerControlGlue.java
index aee3acd..84d4f61 100644
--- a/leanback/src/main/java/androidx/leanback/media/PlaybackBannerControlGlue.java
+++ b/leanback/src/main/java/androidx/leanback/media/PlaybackBannerControlGlue.java
@@ -16,7 +16,7 @@
package androidx.leanback.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.Log;
@@ -95,7 +95,7 @@
ACTION_SKIP_TO_NEXT,
ACTION_CUSTOM_RIGHT_FIRST
})
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
public @interface ACTION_ {}
@@ -151,7 +151,7 @@
PLAYBACK_SPEED_FAST_L3,
PLAYBACK_SPEED_FAST_L4
})
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
private @interface SPEED {}
diff --git a/leanback/src/main/java/androidx/leanback/system/Settings.java b/leanback/src/main/java/androidx/leanback/system/Settings.java
index b24e4f0..636b8d3 100644
--- a/leanback/src/main/java/androidx/leanback/system/Settings.java
+++ b/leanback/src/main/java/androidx/leanback/system/Settings.java
@@ -16,7 +16,7 @@
package androidx.leanback.system;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.ActivityManager;
import android.content.Context;
@@ -76,7 +76,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean preferStaticShadows() {
return mPreferStaticShadows;
}
@@ -86,7 +86,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isOutlineClippingDisabled() {
return mOutlineClippingDisabled;
}
diff --git a/leanback/src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java b/leanback/src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java
index 9693013..836c02c 100644
--- a/leanback/src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java
+++ b/leanback/src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.os.Build;
@@ -27,7 +27,7 @@
* Helper class to load Leanback specific transition.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class LeanbackTransitionHelper {
public static Object loadTitleInTransition(Context context) {
diff --git a/leanback/src/main/java/androidx/leanback/transition/ParallaxTransition.java b/leanback/src/main/java/androidx/leanback/transition/ParallaxTransition.java
index 35636c9..6596cf1 100644
--- a/leanback/src/main/java/androidx/leanback/transition/ParallaxTransition.java
+++ b/leanback/src/main/java/androidx/leanback/transition/ParallaxTransition.java
@@ -16,7 +16,7 @@
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.ValueAnimator;
@@ -43,7 +43,7 @@
* @hide
*/
@RequiresApi(21)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ParallaxTransition extends Visibility {
static Interpolator sInterpolator = new LinearInterpolator();
diff --git a/leanback/src/main/java/androidx/leanback/transition/TransitionHelper.java b/leanback/src/main/java/androidx/leanback/transition/TransitionHelper.java
index 4d8c877..f0ead7d 100644
--- a/leanback/src/main/java/androidx/leanback/transition/TransitionHelper.java
+++ b/leanback/src/main/java/androidx/leanback/transition/TransitionHelper.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.TimeInterpolator;
import android.content.Context;
@@ -40,7 +40,7 @@
* Helper for view transitions.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class TransitionHelper {
public static final int FADE_IN = 0x1;
diff --git a/leanback/src/main/java/androidx/leanback/util/StateMachine.java b/leanback/src/main/java/androidx/leanback/util/StateMachine.java
index 06a33cf..893fa74 100644
--- a/leanback/src/main/java/androidx/leanback/util/StateMachine.java
+++ b/leanback/src/main/java/androidx/leanback/util/StateMachine.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.util;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.util.Log;
@@ -35,7 +35,7 @@
* is executed and {@link Transition#mCondition} passes.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class StateMachine {
static final boolean DEBUG = false;
diff --git a/leanback/src/main/java/androidx/leanback/widget/BackgroundHelper.java b/leanback/src/main/java/androidx/leanback/widget/BackgroundHelper.java
index f72ff44..3a57eb9 100644
--- a/leanback/src/main/java/androidx/leanback/widget/BackgroundHelper.java
+++ b/leanback/src/main/java/androidx/leanback/widget/BackgroundHelper.java
@@ -15,7 +15,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.drawable.Drawable;
import android.os.Build;
@@ -27,7 +27,7 @@
* Helper for view backgrounds.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class BackgroundHelper {
public static void setBackgroundPreservingAlpha(View view, Drawable drawable) {
if (Build.VERSION.SDK_INT >= 19) {
diff --git a/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java b/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java
index 15c843c..f95c78f 100644
--- a/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -45,14 +45,14 @@
* is back to the view.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final static int FOCUS_SCROLL_ALIGNED = 0;
/**
* Scroll to make the focused item inside client area.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final static int FOCUS_SCROLL_ITEM = 1;
/**
@@ -60,7 +60,7 @@
* The page size matches the client area size of RecyclerView.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final static int FOCUS_SCROLL_PAGE = 2;
/**
@@ -272,7 +272,7 @@
* </ul>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setFocusScrollStrategy(int scrollStrategy) {
if (scrollStrategy != FOCUS_SCROLL_ALIGNED && scrollStrategy != FOCUS_SCROLL_ITEM
&& scrollStrategy != FOCUS_SCROLL_PAGE) {
@@ -291,7 +291,7 @@
* </ul>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getFocusScrollStrategy() {
return mLayoutManager.getFocusScrollStrategy();
}
@@ -685,7 +685,7 @@
* Changes the selected item and/or subposition immediately without animation.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSelectedPositionWithSub(int position, int subposition) {
mLayoutManager.setSelectionWithSub(position, subposition, 0);
}
@@ -705,7 +705,7 @@
* another {@link #setSelectedPosition} or {@link #setSelectedPositionSmooth} call.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSelectedPositionWithSub(int position, int subposition, int scrollExtra) {
mLayoutManager.setSelectionWithSub(position, subposition, scrollExtra);
}
@@ -724,7 +724,7 @@
* position.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSelectedPositionSmoothWithSub(int position, int subposition) {
mLayoutManager.setSelectionSmoothWithSub(position, subposition);
}
@@ -796,7 +796,7 @@
* is defined.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getSelectedSubPosition() {
return mLayoutManager.getSubSelection();
}
@@ -1109,7 +1109,7 @@
* Must be bigger or equals to 0.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setExtraLayoutSpace(int extraLayoutSpace) {
mLayoutManager.setExtraLayoutSpace(extraLayoutSpace);
}
@@ -1119,7 +1119,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getExtraLayoutSpace() {
return mLayoutManager.getExtraLayoutSpace();
}
diff --git a/leanback/src/main/java/androidx/leanback/widget/BrowseRowsFrameLayout.java b/leanback/src/main/java/androidx/leanback/widget/BrowseRowsFrameLayout.java
index f8ea638..4332d34 100644
--- a/leanback/src/main/java/androidx/leanback/widget/BrowseRowsFrameLayout.java
+++ b/leanback/src/main/java/androidx/leanback/widget/BrowseRowsFrameLayout.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -28,7 +28,7 @@
* using hardcoded DIPS.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class BrowseRowsFrameLayout extends FrameLayout {
public BrowseRowsFrameLayout(Context context) {
diff --git a/leanback/src/main/java/androidx/leanback/widget/DividerPresenter.java b/leanback/src/main/java/androidx/leanback/widget/DividerPresenter.java
index c0f224f..4b6748f 100644
--- a/leanback/src/main/java/androidx/leanback/widget/DividerPresenter.java
+++ b/leanback/src/main/java/androidx/leanback/widget/DividerPresenter.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.LayoutInflater;
import android.view.View;
@@ -36,7 +36,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public DividerPresenter(int layoutResourceId) {
mLayoutResourceId = layoutResourceId;
}
diff --git a/leanback/src/main/java/androidx/leanback/widget/FocusHighlightHandler.java b/leanback/src/main/java/androidx/leanback/widget/FocusHighlightHandler.java
index 314de8a..db92f83 100644
--- a/leanback/src/main/java/androidx/leanback/widget/FocusHighlightHandler.java
+++ b/leanback/src/main/java/androidx/leanback/widget/FocusHighlightHandler.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.View;
@@ -30,7 +30,7 @@
* @param view The view whose focus is changing.
* @param hasFocus True if focus is gained; false otherwise.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void onItemFocused(View view, boolean hasFocus);
/**
diff --git a/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapter.java b/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapter.java
index 507ad34..351d5c8 100644
--- a/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapter.java
+++ b/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapter.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.util.Log;
import android.view.KeyEvent;
@@ -41,7 +41,7 @@
* {@link GuidedActionAdapter.ClickListener} and {@link GuidedActionAdapter.FocusListener}.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class GuidedActionAdapter extends RecyclerView.Adapter {
static final String TAG = "GuidedActionAdapter";
static final boolean DEBUG = false;
@@ -279,7 +279,7 @@
* Used for serialization only.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public List<GuidedAction> getActions() {
return new ArrayList<GuidedAction>(mActions);
}
diff --git a/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapterGroup.java b/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapterGroup.java
index 0e354de4..f4e16be 100644
--- a/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapterGroup.java
+++ b/leanback/src/main/java/androidx/leanback/widget/GuidedActionAdapterGroup.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.Log;
@@ -32,7 +32,7 @@
* editing finished, maintain the Ime open/close status.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class GuidedActionAdapterGroup {
private static final String TAG_EDIT = "EditableAction";
diff --git a/leanback/src/main/java/androidx/leanback/widget/GuidedActionEditText.java b/leanback/src/main/java/androidx/leanback/widget/GuidedActionEditText.java
index 408380e2..018f7dc1 100644
--- a/leanback/src/main/java/androidx/leanback/widget/GuidedActionEditText.java
+++ b/leanback/src/main/java/androidx/leanback/widget/GuidedActionEditText.java
@@ -146,7 +146,6 @@
* See
* {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
*/
- @SuppressWarnings("RestrictedApi")
@Override
public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
super.setCustomSelectionActionModeCallback(TextViewCompat
diff --git a/leanback/src/main/java/androidx/leanback/widget/GuidedActionsStylist.java b/leanback/src/main/java/androidx/leanback/widget/GuidedActionsStylist.java
index dcfdaab..3770108 100644
--- a/leanback/src/main/java/androidx/leanback/widget/GuidedActionsStylist.java
+++ b/leanback/src/main/java/androidx/leanback/widget/GuidedActionsStylist.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.leanback.widget.GuidedAction.EDITING_ACTIVATOR_VIEW;
import static androidx.leanback.widget.GuidedAction.EDITING_DESCRIPTION;
import static androidx.leanback.widget.GuidedAction.EDITING_NONE;
@@ -1030,7 +1030,7 @@
* Sets listener for reporting view being edited.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setEditListener(EditListener listener) {
mEditListener = listener;
}
diff --git a/leanback/src/main/java/androidx/leanback/widget/InvisibleRowPresenter.java b/leanback/src/main/java/androidx/leanback/widget/InvisibleRowPresenter.java
index 25197f4..d8c6961 100644
--- a/leanback/src/main/java/androidx/leanback/widget/InvisibleRowPresenter.java
+++ b/leanback/src/main/java/androidx/leanback/widget/InvisibleRowPresenter.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
@@ -23,7 +23,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class InvisibleRowPresenter extends RowPresenter {
public InvisibleRowPresenter() {
diff --git a/leanback/src/main/java/androidx/leanback/widget/MediaNowPlayingView.java b/leanback/src/main/java/androidx/leanback/widget/MediaNowPlayingView.java
index 90849f2..3bcce0e 100644
--- a/leanback/src/main/java/androidx/leanback/widget/MediaNowPlayingView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/MediaNowPlayingView.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.ObjectAnimator;
@@ -33,7 +33,7 @@
* The view displaying 3 animated peak meters next to each other when a media item is playing.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MediaNowPlayingView extends LinearLayout{
private final ImageView mImage1;
diff --git a/leanback/src/main/java/androidx/leanback/widget/NonOverlappingLinearLayout.java b/leanback/src/main/java/androidx/leanback/widget/NonOverlappingLinearLayout.java
index bf1385f..6b02520 100644
--- a/leanback/src/main/java/androidx/leanback/widget/NonOverlappingLinearLayout.java
+++ b/leanback/src/main/java/androidx/leanback/widget/NonOverlappingLinearLayout.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -27,7 +27,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class NonOverlappingLinearLayout extends LinearLayout {
boolean mFocusableViewAvailableFixEnabled = false;
diff --git a/leanback/src/main/java/androidx/leanback/widget/ObjectAdapter.java b/leanback/src/main/java/androidx/leanback/widget/ObjectAdapter.java
index 988b5fb0..c938e1e 100644
--- a/leanback/src/main/java/androidx/leanback/widget/ObjectAdapter.java
+++ b/leanback/src/main/java/androidx/leanback/widget/ObjectAdapter.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.database.Observable;
@@ -217,7 +217,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public final boolean hasObserver() {
return mObservable.hasObserver();
}
diff --git a/leanback/src/main/java/androidx/leanback/widget/PagingIndicator.java b/leanback/src/main/java/androidx/leanback/widget/PagingIndicator.java
index 53bda36..dafc41b 100644
--- a/leanback/src/main/java/androidx/leanback/widget/PagingIndicator.java
+++ b/leanback/src/main/java/androidx/leanback/widget/PagingIndicator.java
@@ -16,7 +16,7 @@
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -48,7 +48,7 @@
* A page indicator with dots.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class PagingIndicator extends View {
private static final long DURATION_ALPHA = 167;
private static final long DURATION_DIAMETER = 417;
diff --git a/leanback/src/main/java/androidx/leanback/widget/PlaybackTransportRowView.java b/leanback/src/main/java/androidx/leanback/widget/PlaybackTransportRowView.java
index a99db75..3ccee0e 100644
--- a/leanback/src/main/java/androidx/leanback/widget/PlaybackTransportRowView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/PlaybackTransportRowView.java
@@ -16,7 +16,7 @@
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Rect;
@@ -34,13 +34,13 @@
* View for PlaybackTransportRowPresenter that has a custom focusSearch.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class PlaybackTransportRowView extends LinearLayout {
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface OnUnhandledKeyListener {
/**
* Returns true if the key event should be consumed.
diff --git a/leanback/src/main/java/androidx/leanback/widget/ResizingTextView.java b/leanback/src/main/java/androidx/leanback/widget/ResizingTextView.java
index a839ab9..e7c9bf5 100644
--- a/leanback/src/main/java/androidx/leanback/widget/ResizingTextView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/ResizingTextView.java
@@ -278,7 +278,6 @@
* See
* {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
*/
- @SuppressWarnings("RestrictedApi")
@Override
public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
super.setCustomSelectionActionModeCallback(TextViewCompat
diff --git a/leanback/src/main/java/androidx/leanback/widget/RowHeaderPresenter.java b/leanback/src/main/java/androidx/leanback/widget/RowHeaderPresenter.java
index 5f93dca..1c250de 100644
--- a/leanback/src/main/java/androidx/leanback/widget/RowHeaderPresenter.java
+++ b/leanback/src/main/java/androidx/leanback/widget/RowHeaderPresenter.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Paint;
import android.text.TextUtils;
@@ -49,7 +49,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RowHeaderPresenter(int layoutResourceId) {
this(layoutResourceId, true);
}
@@ -57,7 +57,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RowHeaderPresenter(int layoutResourceId, boolean animateSelect) {
mLayoutResourceId = layoutResourceId;
mAnimateSelect = animateSelect;
@@ -103,7 +103,7 @@
* @param view The single RowHeaderView.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ViewHolder(RowHeaderView view) {
super(view);
mTitleView = view;
diff --git a/leanback/src/main/java/androidx/leanback/widget/RowHeaderView.java b/leanback/src/main/java/androidx/leanback/widget/RowHeaderView.java
index 0d696de..7ca6b2c 100644
--- a/leanback/src/main/java/androidx/leanback/widget/RowHeaderView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/RowHeaderView.java
@@ -42,7 +42,6 @@
* See
* {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
*/
- @SuppressWarnings("RestrictedApi")
@Override
public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
super.setCustomSelectionActionModeCallback(TextViewCompat
diff --git a/leanback/src/main/java/androidx/leanback/widget/ScaleFrameLayout.java b/leanback/src/main/java/androidx/leanback/widget/ScaleFrameLayout.java
index 0c5b9f7..2f88f08 100644
--- a/leanback/src/main/java/androidx/leanback/widget/ScaleFrameLayout.java
+++ b/leanback/src/main/java/androidx/leanback/widget/ScaleFrameLayout.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -29,7 +29,7 @@
* Subclass of FrameLayout that support scale layout area size for children.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ScaleFrameLayout extends FrameLayout {
private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.START;
diff --git a/leanback/src/main/java/androidx/leanback/widget/SeekBar.java b/leanback/src/main/java/androidx/leanback/widget/SeekBar.java
index a484dd1..9b63e88 100644
--- a/leanback/src/main/java/androidx/leanback/widget/SeekBar.java
+++ b/leanback/src/main/java/androidx/leanback/widget/SeekBar.java
@@ -16,7 +16,7 @@
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Canvas;
@@ -37,13 +37,13 @@
* The widget does not deal with KeyEvent, it's client's responsibility to set a key listener.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class SeekBar extends View {
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract static class AccessibilitySeekListener {
/**
* Called to perform AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
diff --git a/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java b/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java
index 0069675..b41d663 100644
--- a/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java
@@ -299,7 +299,6 @@
* See
* {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
*/
- @SuppressWarnings("RestrictedApi")
@Override
public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
super.setCustomSelectionActionModeCallback(TextViewCompat
diff --git a/leanback/src/main/java/androidx/leanback/widget/ThumbsBar.java b/leanback/src/main/java/androidx/leanback/widget/ThumbsBar.java
index 682dcc0..e455ad9 100644
--- a/leanback/src/main/java/androidx/leanback/widget/ThumbsBar.java
+++ b/leanback/src/main/java/androidx/leanback/widget/ThumbsBar.java
@@ -15,7 +15,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Bitmap;
@@ -32,7 +32,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ThumbsBar extends LinearLayout {
// initial value for Thumb's number before measuring the screen size
diff --git a/leanback/src/main/java/androidx/leanback/widget/Util.java b/leanback/src/main/java/androidx/leanback/widget/Util.java
index bda8ac6..663bef5 100644
--- a/leanback/src/main/java/androidx/leanback/widget/Util.java
+++ b/leanback/src/main/java/androidx/leanback/widget/Util.java
@@ -13,7 +13,7 @@
*/
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.View;
import android.view.ViewGroup;
@@ -24,7 +24,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class Util {
/**
diff --git a/leanback/src/main/java/androidx/leanback/widget/Visibility.java b/leanback/src/main/java/androidx/leanback/widget/Visibility.java
index a23ecdb..04730fb 100644
--- a/leanback/src/main/java/androidx/leanback/widget/Visibility.java
+++ b/leanback/src/main/java/androidx/leanback/widget/Visibility.java
@@ -16,7 +16,7 @@
package androidx.leanback.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.View;
@@ -27,7 +27,7 @@
import java.lang.annotation.RetentionPolicy;
/** @hide */
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({View.VISIBLE, View.INVISIBLE, View.GONE})
@Retention(RetentionPolicy.SOURCE)
public @interface Visibility {}
diff --git a/legacy/core-ui/api/1.1.0-alpha01.txt b/legacy/core-ui/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..f2552774
--- /dev/null
+++ b/legacy/core-ui/api/1.1.0-alpha01.txt
@@ -0,0 +1,41 @@
+// Signature format: 3.0
+package androidx.legacy.app {
+
+ @Deprecated public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor @Deprecated public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @DrawableRes int, @StringRes int, @StringRes int);
+ ctor @Deprecated public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, boolean, @DrawableRes int, @StringRes int, @StringRes int);
+ method @Deprecated public boolean isDrawerIndicatorEnabled();
+ method @Deprecated public void onConfigurationChanged(android.content.res.Configuration!);
+ method @Deprecated public void onDrawerClosed(android.view.View!);
+ method @Deprecated public void onDrawerOpened(android.view.View!);
+ method @Deprecated public void onDrawerSlide(android.view.View!, float);
+ method @Deprecated public void onDrawerStateChanged(int);
+ method @Deprecated public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method @Deprecated public void setDrawerIndicatorEnabled(boolean);
+ method @Deprecated public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method @Deprecated public void setHomeAsUpIndicator(int);
+ method @Deprecated public void syncState();
+ }
+
+ @Deprecated public static interface ActionBarDrawerToggle.Delegate {
+ method @Deprecated public android.graphics.drawable.Drawable? getThemeUpIndicator();
+ method @Deprecated public void setActionBarDescription(@StringRes int);
+ method @Deprecated public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ @Deprecated public static interface ActionBarDrawerToggle.DelegateProvider {
+ method @Deprecated public androidx.legacy.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+}
+
+package androidx.legacy.widget {
+
+ @Deprecated public class Space extends android.view.View {
+ ctor @Deprecated public Space(android.content.Context, android.util.AttributeSet?, int);
+ ctor @Deprecated public Space(android.content.Context, android.util.AttributeSet?);
+ ctor @Deprecated public Space(android.content.Context);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/legacy/core-ui/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to legacy/core-ui/api/res-1.1.0-alpha01.txt
diff --git a/legacy/core-utils/api/1.1.0-alpha01.txt b/legacy/core-utils/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..5e8a796
--- /dev/null
+++ b/legacy/core-utils/api/1.1.0-alpha01.txt
@@ -0,0 +1,11 @@
+// Signature format: 3.0
+package androidx.legacy.content {
+
+ @Deprecated public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
+ ctor @Deprecated public WakefulBroadcastReceiver();
+ method @Deprecated public static boolean completeWakefulIntent(android.content.Intent!);
+ method @Deprecated public static android.content.ComponentName! startWakefulService(android.content.Context!, android.content.Intent!);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/legacy/core-utils/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to legacy/core-utils/api/res-1.1.0-alpha01.txt
diff --git a/legacy/v13/api/1.1.0-alpha01.txt b/legacy/v13/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..87015e1
--- /dev/null
+++ b/legacy/v13/api/1.1.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.legacy.app {
+
+ @Deprecated public class ActivityCompat extends androidx.core.app.ActivityCompat {
+ ctor @Deprecated protected ActivityCompat();
+ }
+
+ @Deprecated public class FragmentCompat {
+ ctor @Deprecated public FragmentCompat();
+ method @Deprecated public static void requestPermissions(android.app.Fragment, String[], int);
+ method @Deprecated public static void setMenuVisibility(android.app.Fragment!, boolean);
+ method @Deprecated public static void setPermissionCompatDelegate(androidx.legacy.app.FragmentCompat.PermissionCompatDelegate!);
+ method @Deprecated public static void setUserVisibleHint(android.app.Fragment!, boolean);
+ method @Deprecated public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, String);
+ }
+
+ @Deprecated public static interface FragmentCompat.OnRequestPermissionsResultCallback {
+ method @Deprecated public void onRequestPermissionsResult(int, String[], int[]);
+ }
+
+ @Deprecated public static interface FragmentCompat.PermissionCompatDelegate {
+ method @Deprecated public boolean requestPermissions(android.app.Fragment!, String[]!, int);
+ }
+
+ @Deprecated public abstract class FragmentPagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+ ctor @Deprecated public FragmentPagerAdapter(android.app.FragmentManager!);
+ method @Deprecated public abstract android.app.Fragment! getItem(int);
+ method @Deprecated public long getItemId(int);
+ method @Deprecated public boolean isViewFromObject(android.view.View!, Object!);
+ }
+
+ @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+ ctor @Deprecated public FragmentStatePagerAdapter(android.app.FragmentManager!);
+ method @Deprecated public abstract android.app.Fragment! getItem(int);
+ method @Deprecated public boolean isViewFromObject(android.view.View!, Object!);
+ }
+
+ @Deprecated public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+ ctor @Deprecated public FragmentTabHost(android.content.Context!);
+ ctor @Deprecated public FragmentTabHost(android.content.Context!, android.util.AttributeSet!);
+ method @Deprecated public void addTab(android.widget.TabHost.TabSpec!, Class<?>!, android.os.Bundle!);
+ method @Deprecated public void onTabChanged(String!);
+ method @Deprecated public void setup(android.content.Context!, android.app.FragmentManager!);
+ method @Deprecated public void setup(android.content.Context!, android.app.FragmentManager!, int);
+ }
+
+}
+
+package androidx.legacy.view {
+
+ @Deprecated public class ViewCompat extends androidx.core.view.ViewCompat {
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/legacy/v13/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to legacy/v13/api/res-1.1.0-alpha01.txt
diff --git a/legacy/v13/src/main/java/androidx/legacy/app/FragmentCompat.java b/legacy/v13/src/main/java/androidx/legacy/app/FragmentCompat.java
index 34685ab..ac182f5 100644
--- a/legacy/v13/src/main/java/androidx/legacy/app/FragmentCompat.java
+++ b/legacy/v13/src/main/java/androidx/legacy/app/FragmentCompat.java
@@ -192,7 +192,7 @@
* @deprecated Use {@link androidx.fragment.app.Fragment} instead of the framework
* {@link Fragment}.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Deprecated
public static PermissionCompatDelegate getPermissionCompatDelegate() {
return sDelegate;
diff --git a/lifecycle/common-java8/api/2.1.0-alpha03.txt b/lifecycle/common-java8/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..498d3a9
--- /dev/null
+++ b/lifecycle/common-java8/api/2.1.0-alpha03.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver androidx.lifecycle.LifecycleObserver {
+ method public default void onCreate(androidx.lifecycle.LifecycleOwner);
+ method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
+ method public default void onPause(androidx.lifecycle.LifecycleOwner);
+ method public default void onResume(androidx.lifecycle.LifecycleOwner);
+ method public default void onStart(androidx.lifecycle.LifecycleOwner);
+ method public default void onStop(androidx.lifecycle.LifecycleOwner);
+ }
+
+}
+
diff --git a/lifecycle/common-java8/build.gradle b/lifecycle/common-java8/build.gradle
index 71277e5..cf02115 100644
--- a/lifecycle/common-java8/build.gradle
+++ b/lifecycle/common-java8/build.gradle
@@ -28,7 +28,7 @@
dependencies {
compile(project(":lifecycle:lifecycle-common"))
- compile(SUPPORT_ANNOTATIONS)
+ compile(project(":annotation"))
testCompile(JUNIT)
testCompile(MOCKITO_CORE)
diff --git a/lifecycle/common/api/2.1.0-alpha03.txt b/lifecycle/common/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..f23b5eb
--- /dev/null
+++ b/lifecycle/common/api/2.1.0-alpha03.txt
@@ -0,0 +1,46 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public abstract class Lifecycle {
+ ctor public Lifecycle();
+ method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
+ method @MainThread public abstract androidx.lifecycle.Lifecycle.State getCurrentState();
+ method @MainThread public abstract void removeObserver(androidx.lifecycle.LifecycleObserver);
+ }
+
+ public enum Lifecycle.Event {
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_ANY;
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_CREATE;
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_DESTROY;
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_PAUSE;
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_RESUME;
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_START;
+ enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_STOP;
+ }
+
+ public enum Lifecycle.State {
+ method public boolean isAtLeast(androidx.lifecycle.Lifecycle.State);
+ enum_constant public static final androidx.lifecycle.Lifecycle.State CREATED;
+ enum_constant public static final androidx.lifecycle.Lifecycle.State DESTROYED;
+ enum_constant public static final androidx.lifecycle.Lifecycle.State INITIALIZED;
+ enum_constant public static final androidx.lifecycle.Lifecycle.State RESUMED;
+ enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
+ }
+
+ public interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
+ method public void onStateChanged(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.Event);
+ }
+
+ public interface LifecycleObserver {
+ }
+
+ public interface LifecycleOwner {
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+ method public abstract androidx.lifecycle.Lifecycle.Event value();
+ }
+
+}
+
diff --git a/lifecycle/common/build.gradle b/lifecycle/common/build.gradle
index 8d36e45..75037fa 100644
--- a/lifecycle/common/build.gradle
+++ b/lifecycle/common/build.gradle
@@ -28,7 +28,7 @@
dependencies {
testCompile(JUNIT)
testCompile(MOCKITO_CORE)
- compile(SUPPORT_ANNOTATIONS)
+ compile(project(":annotation"))
}
supportLibrary {
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java b/lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
index 873445d..9f4b7b4 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
+++ b/lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
@@ -22,7 +22,7 @@
/**
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class CompositeGeneratedAdaptersObserver implements LifecycleEventObserver {
private final GeneratedAdapter[] mGeneratedAdapters;
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java b/lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
index a70d67b..7d5dede2 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
+++ b/lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
@@ -21,7 +21,7 @@
/**
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public interface GeneratedAdapter {
/**
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java b/lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
index bf2bceb..1c0c70a 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
+++ b/lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
@@ -25,6 +25,6 @@
* @deprecated and it is scheduled to be removed in lifecycle 3.0
*/
@Deprecated
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public interface GenericLifecycleObserver extends LifecycleEventObserver {
}
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java b/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
index c0b4407..9450466 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
+++ b/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class Lifecycling {
private static final int REFLECTIVE_CALLBACK = 1;
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java b/lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
index 0401a22..f091d87 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
+++ b/lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
@@ -24,14 +24,14 @@
/**
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class MethodCallsLogger {
private Map<String, Integer> mCalledMethods = new HashMap<>();
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public boolean approveCall(String name, int type) {
Integer nullableMask = mCalledMethods.get(name);
int mask = nullableMask != null ? nullableMask : 0;
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java b/lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
index f9cd5d1..abccb5f1 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
+++ b/lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
@@ -21,7 +21,7 @@
/**
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class SingleGeneratedAdapterObserver implements LifecycleEventObserver {
private final GeneratedAdapter mGeneratedAdapter;
diff --git a/lifecycle/extensions/api/2.1.0-alpha03.txt b/lifecycle/extensions/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..c85f1ab
--- /dev/null
+++ b/lifecycle/extensions/api/2.1.0-alpha03.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public class ViewModelProviders {
+ ctor @Deprecated public ViewModelProviders();
+ method @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment);
+ method @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity);
+ method @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.Fragment, androidx.lifecycle.ViewModelProvider.Factory?);
+ method @MainThread public static androidx.lifecycle.ViewModelProvider of(androidx.fragment.app.FragmentActivity, androidx.lifecycle.ViewModelProvider.Factory?);
+ }
+
+ @Deprecated public static class ViewModelProviders.DefaultFactory extends androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory {
+ ctor @Deprecated public ViewModelProviders.DefaultFactory(android.app.Application);
+ }
+
+ @Deprecated public class ViewModelStores {
+ method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.FragmentActivity);
+ method @Deprecated @MainThread public static androidx.lifecycle.ViewModelStore of(androidx.fragment.app.Fragment);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/extensions/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/extensions/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha03.txt b/lifecycle/livedata-core/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..f0db7db
--- /dev/null
+++ b/lifecycle/livedata-core/api/2.1.0-alpha03.txt
@@ -0,0 +1,32 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public abstract class LiveData<T> {
+ ctor public LiveData(T!);
+ ctor public LiveData();
+ method public T? getValue();
+ method public boolean hasActiveObservers();
+ method public boolean hasObservers();
+ method @MainThread public void observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer<? super T>);
+ method @MainThread public void observeForever(androidx.lifecycle.Observer<? super T>);
+ method protected void onActive();
+ method protected void onInactive();
+ method protected void postValue(T!);
+ method @MainThread public void removeObserver(androidx.lifecycle.Observer<? super T>);
+ method @MainThread public void removeObservers(androidx.lifecycle.LifecycleOwner);
+ method @MainThread protected void setValue(T!);
+ }
+
+ public class MutableLiveData<T> extends androidx.lifecycle.LiveData<T> {
+ ctor public MutableLiveData(T!);
+ ctor public MutableLiveData();
+ method public void postValue(T!);
+ method public void setValue(T!);
+ }
+
+ public interface Observer<T> {
+ method public void onChanged(T!);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/livedata-core/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/livedata-core/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt b/lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..861a341
--- /dev/null
+++ b/lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public final class LiveDataKt {
+ ctor public LiveDataKt();
+ method @MainThread public static inline <T> androidx.lifecycle.Observer<T> observe(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner owner, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onChanged);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha03.txt b/lifecycle/livedata/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..2f5616b
--- /dev/null
+++ b/lifecycle/livedata/api/2.1.0-alpha03.txt
@@ -0,0 +1,17 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public class MediatorLiveData<T> extends androidx.lifecycle.MutableLiveData<T> {
+ ctor public MediatorLiveData();
+ method @MainThread public <S> void addSource(androidx.lifecycle.LiveData<S>, androidx.lifecycle.Observer<? super S>);
+ method @MainThread public <S> void removeSource(androidx.lifecycle.LiveData<S>);
+ }
+
+ public class Transformations {
+ method @MainThread public static <X> androidx.lifecycle.LiveData<X> distinctUntilChanged(androidx.lifecycle.LiveData<X>);
+ method @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,Y>);
+ method @MainThread public static <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, androidx.arch.core.util.Function<X,androidx.lifecycle.LiveData<Y>>);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/livedata/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/livedata/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha03.txt b/lifecycle/livedata/ktx/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..a21c943
--- /dev/null
+++ b/lifecycle/livedata/ktx/api/2.1.0-alpha03.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public final class TransformationsKt {
+ ctor public TransformationsKt();
+ method public static inline <X> androidx.lifecycle.LiveData<X> distinctUntilChanged(androidx.lifecycle.LiveData<X>);
+ method public static inline <X, Y> androidx.lifecycle.LiveData<Y> map(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<? super X,? extends Y> transform);
+ method public static inline <X, Y> androidx.lifecycle.LiveData<Y> switchMap(androidx.lifecycle.LiveData<X>, kotlin.jvm.functions.Function1<? super X,? extends androidx.lifecycle.LiveData<Y>> transform);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java b/lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
index 7ce7a0a..837a35d 100644
--- a/lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
+++ b/lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
@@ -37,7 +37,7 @@
* @param <T> The type of the live data
* @hide internal
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class ComputableLiveData<T> {
@SuppressWarnings("WeakerAccess") /* synthetic access */
final Executor mExecutor;
diff --git a/lifecycle/process/api/2.1.0-alpha03.txt b/lifecycle/process/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..beea619
--- /dev/null
+++ b/lifecycle/process/api/2.1.0-alpha03.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public class ProcessLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
+ method public static androidx.lifecycle.LifecycleOwner get();
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/process/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/process/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java b/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
index ba3dfe9..18133c8 100644
--- a/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
+++ b/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
@@ -30,7 +30,7 @@
* @hide
*/
@SuppressWarnings("UnknownNullness") // TODO https://issuetracker.google.com/issues/112197238
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ProcessLifecycleOwnerInitializer extends ContentProvider {
@Override
public boolean onCreate() {
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha03.txt b/lifecycle/reactivestreams/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..f3d107a
--- /dev/null
+++ b/lifecycle/reactivestreams/api/2.1.0-alpha03.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public final class LiveDataReactiveStreams {
+ method public static <T> androidx.lifecycle.LiveData<T> fromPublisher(org.reactivestreams.Publisher<T>);
+ method public static <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.LiveData<T>);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/reactivestreams/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/reactivestreams/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/build.gradle b/lifecycle/reactivestreams/build.gradle
index 0a412b5..bed1534 100644
--- a/lifecycle/reactivestreams/build.gradle
+++ b/lifecycle/reactivestreams/build.gradle
@@ -34,7 +34,7 @@
api(project(":lifecycle:lifecycle-common"))
api(project(":lifecycle:lifecycle-livedata"))
api(project(":lifecycle:lifecycle-runtime"))
- api(SUPPORT_ANNOTATIONS)
+ api(project(":annotation"))
api(REACTIVE_STREAMS)
annotationProcessor(NULLAWAY)
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt b/lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..659d07d
--- /dev/null
+++ b/lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt
@@ -0,0 +1,11 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public final class LiveDataReactiveSteamsKt {
+ ctor public LiveDataReactiveSteamsKt();
+ method public static inline <T> androidx.lifecycle.LiveData<T> toLiveData(org.reactivestreams.Publisher<T>);
+ method public static inline <T> org.reactivestreams.Publisher<T> toPublisher(androidx.lifecycle.LiveData<T>, androidx.lifecycle.LifecycleOwner lifecycle);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha03.txt b/lifecycle/runtime/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..0a652c0
--- /dev/null
+++ b/lifecycle/runtime/api/2.1.0-alpha03.txt
@@ -0,0 +1,20 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public class LifecycleRegistry extends androidx.lifecycle.Lifecycle {
+ ctor public LifecycleRegistry(androidx.lifecycle.LifecycleOwner);
+ method public void addObserver(androidx.lifecycle.LifecycleObserver);
+ method public androidx.lifecycle.Lifecycle.State getCurrentState();
+ method public int getObserverCount();
+ method public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event);
+ method @Deprecated @MainThread public void markState(androidx.lifecycle.Lifecycle.State);
+ method public void removeObserver(androidx.lifecycle.LifecycleObserver);
+ method @MainThread public void setCurrentState(androidx.lifecycle.Lifecycle.State);
+ }
+
+ @Deprecated public interface LifecycleRegistryOwner extends androidx.lifecycle.LifecycleOwner {
+ method @Deprecated public androidx.lifecycle.LifecycleRegistry getLifecycle();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/runtime/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/runtime/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/runtime/build.gradle
index fc45423..ab40c7d 100644
--- a/lifecycle/runtime/build.gradle
+++ b/lifecycle/runtime/build.gradle
@@ -21,7 +21,7 @@
api(project(":lifecycle:lifecycle-common"))
api(project(":arch:core-common"))
// necessary for IJ to resolve dependencies.
- api(SUPPORT_ANNOTATIONS)
+ api(project(":annotation"))
testImplementation(JUNIT)
testImplementation(MOCKITO_CORE)
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java b/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java
index ca1f3a9..e2a80a2 100644
--- a/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java
+++ b/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java
@@ -28,7 +28,7 @@
* @hide
*/
@SuppressWarnings("UnknownNullness") // TODO https://issuetracker.google.com/issues/112197238
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
diff --git a/lifecycle/service/api/2.1.0-alpha03.txt b/lifecycle/service/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..a12d86e
--- /dev/null
+++ b/lifecycle/service/api/2.1.0-alpha03.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public class LifecycleService extends android.app.Service implements androidx.lifecycle.LifecycleOwner {
+ ctor public LifecycleService();
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ method @CallSuper public android.os.IBinder? onBind(android.content.Intent);
+ method @CallSuper public void onStart(android.content.Intent, int);
+ }
+
+ public class ServiceLifecycleDispatcher {
+ ctor public ServiceLifecycleDispatcher(androidx.lifecycle.LifecycleOwner);
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ method public void onServicePreSuperOnBind();
+ method public void onServicePreSuperOnCreate();
+ method public void onServicePreSuperOnDestroy();
+ method public void onServicePreSuperOnStart();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/service/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/service/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel-savedstate/build.gradle b/lifecycle/viewmodel-savedstate/build.gradle
index b73b401..80941d5 100644
--- a/lifecycle/viewmodel-savedstate/build.gradle
+++ b/lifecycle/viewmodel-savedstate/build.gradle
@@ -31,8 +31,8 @@
}
dependencies {
- api(SUPPORT_ANNOTATIONS)
- api(project(":savedstate:savedstate-common"))
+ api(project(":annotation"))
+ api(project(":savedstate"))
api(project(":lifecycle:lifecycle-livedata-core"))
api(project(":lifecycle:lifecycle-viewmodel"))
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
index cd3a0dc..d45057c 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
@@ -32,7 +32,7 @@
public abstract class AbstractSavedStateVMFactory implements ViewModelProvider.KeyedFactory {
static final String TAG_SAVED_STATE_HANDLE = "androidx.lifecycle.savedstate.vm.tag";
- private final SavedStateRegistry<Bundle> mSavedStateRegistry;
+ private final SavedStateRegistry mSavedStateRegistry;
private final Bundle mDefaultArgs;
/**
@@ -40,7 +40,7 @@
*/
public AbstractSavedStateVMFactory(
@NonNull Application application,
- @NonNull SavedStateRegistry<Bundle> savedStateRegistry,
+ @NonNull SavedStateRegistry savedStateRegistry,
@Nullable Bundle defaultArgs) {
mSavedStateRegistry = savedStateRegistry;
mDefaultArgs = defaultArgs;
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
index 564d19a2..b2c7610 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
@@ -90,8 +90,8 @@
}
@NonNull
- SavedStateProvider<Bundle> savedStateProvider() {
- return new SavedStateProvider<Bundle>() {
+ SavedStateProvider savedStateProvider() {
+ return new SavedStateProvider() {
@SuppressWarnings("unchecked")
@NonNull
@Override
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
index c642040..73a1b1b 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
@@ -70,7 +70,7 @@
*/
public SavedStateVMFactory(@NonNull Fragment fragment, @Nullable Bundle defaultArgs) {
this(checkApplication(checkActivity(fragment)),
- fragment.getBundleSavedStateRegistry(), defaultArgs);
+ fragment.getSavedStateRegistry(), defaultArgs);
}
/**
@@ -97,7 +97,7 @@
* misses a value by such key.
*/
public SavedStateVMFactory(@NonNull FragmentActivity activity, @Nullable Bundle defaultArgs) {
- this(checkApplication(activity), activity.getBundleSavedStateRegistry(), defaultArgs);
+ this(checkApplication(activity), activity.getSavedStateRegistry(), defaultArgs);
}
/**
@@ -113,7 +113,7 @@
* misses a value by such key.
*/
public SavedStateVMFactory(@NonNull Application application,
- @NonNull SavedStateRegistry<Bundle> savedStateRegistry,
+ @NonNull SavedStateRegistry savedStateRegistry,
@Nullable Bundle defaultArgs) {
super(application, savedStateRegistry, defaultArgs);
mApplication = application;
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/VMSavedStateInitializer.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/VMSavedStateInitializer.java
index d2d61dd..76c691e 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/VMSavedStateInitializer.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/VMSavedStateInitializer.java
@@ -50,7 +50,7 @@
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
// next event is going to be created....
if (!fragmentActivity.getViewModelStore().keys().isEmpty()) {
- attach(fragmentActivity.getBundleSavedStateRegistry(), fragmentActivity);
+ attach(fragmentActivity.getSavedStateRegistry(), fragmentActivity);
}
source.getLifecycle().removeObserver(this);
}
@@ -90,7 +90,7 @@
}
@SuppressWarnings("WeakerAccess")
- static void attach(SavedStateRegistry<Bundle> savedStateStore, ViewModelStoreOwner store) {
+ static void attach(SavedStateRegistry savedStateStore, ViewModelStoreOwner store) {
ViewModelStore viewModelStore = store.getViewModelStore();
for (String key : viewModelStore.keys()) {
ViewModel viewModel = viewModelStore.get(key);
@@ -108,7 +108,7 @@
public void onFragmentAttached(@NonNull FragmentManager fm,
@NonNull Fragment fragment, @NonNull Context context) {
if (!fragment.getViewModelStore().keys().isEmpty()) {
- attach(fragment.getBundleSavedStateRegistry(), fragment);
+ attach(fragment.getSavedStateRegistry(), fragment);
}
}
}
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha03.txt b/lifecycle/viewmodel/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..0a6e010
--- /dev/null
+++ b/lifecycle/viewmodel/api/2.1.0-alpha03.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public class AndroidViewModel extends androidx.lifecycle.ViewModel {
+ ctor public AndroidViewModel(android.app.Application);
+ method public <T extends android.app.Application> T getApplication();
+ }
+
+ public abstract class ViewModel {
+ ctor public ViewModel();
+ method protected void onCleared();
+ }
+
+ public class ViewModelProvider {
+ ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.ViewModelProvider.Factory);
+ ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore, androidx.lifecycle.ViewModelProvider.Factory);
+ ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.ViewModelProvider.KeyedFactory);
+ ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore, androidx.lifecycle.ViewModelProvider.KeyedFactory);
+ method @MainThread public <T extends androidx.lifecycle.ViewModel> T get(Class<T>);
+ method @MainThread public <T extends androidx.lifecycle.ViewModel> T get(String, Class<T>);
+ }
+
+ public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+ ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application);
+ method public static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application);
+ }
+
+ public static interface ViewModelProvider.Factory {
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T>);
+ }
+
+ public static interface ViewModelProvider.KeyedFactory {
+ method public <T extends androidx.lifecycle.ViewModel> T create(String, Class<T>);
+ }
+
+ public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+ ctor public ViewModelProvider.NewInstanceFactory();
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T>);
+ }
+
+ public class ViewModelStore {
+ ctor public ViewModelStore();
+ method public final void clear();
+ }
+
+ public interface ViewModelStoreOwner {
+ method public androidx.lifecycle.ViewModelStore getViewModelStore();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/viewmodel/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/viewmodel/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/build.gradle b/lifecycle/viewmodel/build.gradle
index 7d940ce..bdb416e 100644
--- a/lifecycle/viewmodel/build.gradle
+++ b/lifecycle/viewmodel/build.gradle
@@ -34,7 +34,7 @@
}
dependencies {
- api(SUPPORT_ANNOTATIONS)
+ api(project(":annotation"))
testImplementation(JUNIT)
testImplementation(MOCKITO_CORE)
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt b/lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt
new file mode 100644
index 0000000..2c78583
--- /dev/null
+++ b/lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.lifecycle {
+
+ public final class ViewModelKt {
+ ctor public ViewModelKt();
+ method public static kotlinx.coroutines.CoroutineScope getViewModelScope(androidx.lifecycle.ViewModel);
+ }
+
+ public final class ViewModelLazy<VM extends androidx.lifecycle.ViewModel> implements kotlin.Lazy<VM> {
+ ctor public ViewModelLazy(kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStoreOwner> ownerProducer, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory> factoryProducer);
+ method public VM getValue();
+ method public boolean isInitialized();
+ property public VM value;
+ }
+
+ public final class ViewModelProviderKt {
+ ctor public ViewModelProviderKt();
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! get(androidx.lifecycle.ViewModelProvider);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt
diff --git a/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java b/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java
index da4a8ec1..8e7d67f 100644
--- a/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java
+++ b/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java
@@ -204,6 +204,38 @@
initialCallback.mLoader.isReset());
}
+ /**
+ * Ensures that calling restartLoader from onLoadFinished will not reset current loader.
+ * This is especially important for CursorLoader which closes cursor when Loader is reset.
+ * This means that rest of onLoadFinished could access closed cursor.
+ */
+ @Test
+ public void testRestartLoaderWhileDeliveringData() throws Throwable {
+ CountDownLatch initialCountDownLatch = new CountDownLatch(1);
+ final DelayLoaderCallbacks initialCallback = new DelayLoaderCallbacks(mock(Context.class),
+ initialCountDownLatch) {
+ @Override
+ public void onLoadFinished(@NonNull Loader<Boolean> loader, Boolean data) {
+ super.onLoadFinished(loader, data);
+ assertFalse("Assumption is that loader is not reset in onLoadFinished",
+ loader.isReset());
+ mLoaderManager.restartLoader(45, null,
+ new DelayLoaderCallbacks(mock(Context.class), new CountDownLatch(1)));
+ assertFalse("Loader should not be reset when restarted in onLoadFinished",
+ loader.isReset());
+ }
+ };
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mLoaderManager.initLoader(45, null, initialCallback);
+ }
+ });
+ // Wait for the Loader to return data
+ initialCountDownLatch.await(1, TimeUnit.SECONDS);
+ }
+
+
@Test
public void testRestartLoaderMultiple() throws Throwable {
CountDownLatch initialCountDownLatch = new CountDownLatch(1);
diff --git a/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java b/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java
index 37586b2..00dceb2 100644
--- a/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java
+++ b/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java
@@ -250,8 +250,8 @@
Log.v(TAG, " onLoadFinished in " + mLoader + ": "
+ mLoader.dataToString(data));
}
- mCallback.onLoadFinished(mLoader, data);
mDeliveredData = true;
+ mCallback.onLoadFinished(mLoader, data);
}
boolean hasDeliveredData() {
diff --git a/localbroadcastmanager/api/1.1.0-alpha02.txt b/localbroadcastmanager/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..665dd3c
--- /dev/null
+++ b/localbroadcastmanager/api/1.1.0-alpha02.txt
@@ -0,0 +1,13 @@
+// Signature format: 3.0
+package androidx.localbroadcastmanager.content {
+
+ @Deprecated public final class LocalBroadcastManager {
+ method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
+ method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method @Deprecated public boolean sendBroadcast(android.content.Intent);
+ method @Deprecated public void sendBroadcastSync(android.content.Intent);
+ method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/localbroadcastmanager/api/res-1.1.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to localbroadcastmanager/api/res-1.1.0-alpha02.txt
diff --git a/media/api/1.1.0-alpha02.txt b/media/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..c4e14c0
--- /dev/null
+++ b/media/api/1.1.0-alpha02.txt
@@ -0,0 +1,702 @@
+// Signature format: 3.0
+package android.support.v4.media {
+
+ public final class MediaBrowserCompat {
+ ctor public MediaBrowserCompat(android.content.Context!, android.content.ComponentName!, android.support.v4.media.MediaBrowserCompat.ConnectionCallback!, android.os.Bundle!);
+ method public void connect();
+ method public void disconnect();
+ method public android.os.Bundle? getExtras();
+ method public void getItem(String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
+ method public String getRoot();
+ method public android.content.ComponentName getServiceComponent();
+ method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+ method public boolean isConnected();
+ method public void search(String, android.os.Bundle!, android.support.v4.media.MediaBrowserCompat.SearchCallback);
+ method public void sendCustomAction(String, android.os.Bundle!, android.support.v4.media.MediaBrowserCompat.CustomActionCallback?);
+ method public void subscribe(String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+ method public void subscribe(String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+ method public void unsubscribe(String);
+ method public void unsubscribe(String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+ field public static final String CUSTOM_ACTION_DOWNLOAD = "android.support.v4.media.action.DOWNLOAD";
+ field public static final String CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE = "android.support.v4.media.action.REMOVE_DOWNLOADED_FILE";
+ field public static final String EXTRA_DOWNLOAD_PROGRESS = "android.media.browse.extra.DOWNLOAD_PROGRESS";
+ field public static final String EXTRA_MEDIA_ID = "android.media.browse.extra.MEDIA_ID";
+ field public static final String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+ field public static final String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+ }
+
+ public static class MediaBrowserCompat.ConnectionCallback {
+ ctor public MediaBrowserCompat.ConnectionCallback();
+ method public void onConnected();
+ method public void onConnectionFailed();
+ method public void onConnectionSuspended();
+ }
+
+ public abstract static class MediaBrowserCompat.CustomActionCallback {
+ ctor public MediaBrowserCompat.CustomActionCallback();
+ method public void onError(String!, android.os.Bundle!, android.os.Bundle!);
+ method public void onProgressUpdate(String!, android.os.Bundle!, android.os.Bundle!);
+ method public void onResult(String!, android.os.Bundle!, android.os.Bundle!);
+ }
+
+ public abstract static class MediaBrowserCompat.ItemCallback {
+ ctor public MediaBrowserCompat.ItemCallback();
+ method public void onError(String);
+ method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem!);
+ }
+
+ public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
+ ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
+ method public int describeContents();
+ method public static android.support.v4.media.MediaBrowserCompat.MediaItem! fromMediaItem(Object!);
+ method public static java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>! fromMediaItemList(java.util.List<?>!);
+ method public android.support.v4.media.MediaDescriptionCompat getDescription();
+ method public int getFlags();
+ method public String? getMediaId();
+ method public boolean isBrowsable();
+ method public boolean isPlayable();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem>! CREATOR;
+ field public static final int FLAG_BROWSABLE = 1; // 0x1
+ field public static final int FLAG_PLAYABLE = 2; // 0x2
+ }
+
+ public abstract static class MediaBrowserCompat.SearchCallback {
+ ctor public MediaBrowserCompat.SearchCallback();
+ method public void onError(String, android.os.Bundle!);
+ method public void onSearchResult(String, android.os.Bundle!, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+ }
+
+ public abstract static class MediaBrowserCompat.SubscriptionCallback {
+ ctor public MediaBrowserCompat.SubscriptionCallback();
+ method public void onChildrenLoaded(String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+ method public void onChildrenLoaded(String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>, android.os.Bundle);
+ method public void onError(String);
+ method public void onError(String, android.os.Bundle);
+ }
+
+ public final class MediaDescriptionCompat implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.support.v4.media.MediaDescriptionCompat! fromMediaDescription(Object!);
+ method public CharSequence? getDescription();
+ method public android.os.Bundle? getExtras();
+ method public android.graphics.Bitmap? getIconBitmap();
+ method public android.net.Uri? getIconUri();
+ method public Object! getMediaDescription();
+ method public String? getMediaId();
+ method public android.net.Uri? getMediaUri();
+ method public CharSequence? getSubtitle();
+ method public CharSequence? getTitle();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
+ field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
+ field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L
+ field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L
+ field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L
+ field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
+ field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat>! CREATOR;
+ field public static final String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
+ field public static final String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
+ field public static final long STATUS_DOWNLOADED = 2L; // 0x2L
+ field public static final long STATUS_DOWNLOADING = 1L; // 0x1L
+ field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L
+ }
+
+ public static final class MediaDescriptionCompat.Builder {
+ ctor public MediaDescriptionCompat.Builder();
+ method public android.support.v4.media.MediaDescriptionCompat! build();
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setDescription(CharSequence?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setExtras(android.os.Bundle?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setIconBitmap(android.graphics.Bitmap?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setIconUri(android.net.Uri?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setMediaId(String?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setMediaUri(android.net.Uri?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setSubtitle(CharSequence?);
+ method public android.support.v4.media.MediaDescriptionCompat.Builder! setTitle(CharSequence?);
+ }
+
+ public final class MediaMetadataCompat implements android.os.Parcelable {
+ method public boolean containsKey(String!);
+ method public int describeContents();
+ method public static android.support.v4.media.MediaMetadataCompat! fromMediaMetadata(Object!);
+ method public android.graphics.Bitmap! getBitmap(String!);
+ method public android.os.Bundle! getBundle();
+ method public android.support.v4.media.MediaDescriptionCompat! getDescription();
+ method public long getLong(String!);
+ method public Object! getMediaMetadata();
+ method public android.support.v4.media.RatingCompat! getRating(String!);
+ method public String! getString(String!);
+ method public CharSequence! getText(String!);
+ method public java.util.Set<java.lang.String>! keySet();
+ method public int size();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat>! CREATOR;
+ field public static final String METADATA_KEY_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
+ field public static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
+ field public static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
+ field public static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+ field public static final String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
+ field public static final String METADATA_KEY_ART = "android.media.metadata.ART";
+ field public static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
+ field public static final String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
+ field public static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
+ field public static final String METADATA_KEY_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
+ field public static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
+ field public static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
+ field public static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
+ field public static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+ field public static final String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
+ field public static final String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
+ field public static final String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
+ field public static final String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
+ field public static final String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
+ field public static final String METADATA_KEY_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS";
+ field public static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
+ field public static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
+ field public static final String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
+ field public static final String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
+ field public static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
+ field public static final String METADATA_KEY_RATING = "android.media.metadata.RATING";
+ field public static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
+ field public static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+ field public static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
+ field public static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
+ field public static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
+ }
+
+ public static final class MediaMetadataCompat.Builder {
+ ctor public MediaMetadataCompat.Builder();
+ ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat!);
+ method public android.support.v4.media.MediaMetadataCompat! build();
+ method public android.support.v4.media.MediaMetadataCompat.Builder! putBitmap(String!, android.graphics.Bitmap!);
+ method public android.support.v4.media.MediaMetadataCompat.Builder! putLong(String!, long);
+ method public android.support.v4.media.MediaMetadataCompat.Builder! putRating(String!, android.support.v4.media.RatingCompat!);
+ method public android.support.v4.media.MediaMetadataCompat.Builder! putString(String!, String!);
+ method public android.support.v4.media.MediaMetadataCompat.Builder! putText(String!, CharSequence!);
+ }
+
+ public final class RatingCompat implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.support.v4.media.RatingCompat! fromRating(Object!);
+ method public float getPercentRating();
+ method public Object! getRating();
+ method public int getRatingStyle();
+ method public float getStarRating();
+ method public boolean hasHeart();
+ method public boolean isRated();
+ method public boolean isThumbUp();
+ method public static android.support.v4.media.RatingCompat! newHeartRating(boolean);
+ method public static android.support.v4.media.RatingCompat! newPercentageRating(float);
+ method public static android.support.v4.media.RatingCompat! newStarRating(int, float);
+ method public static android.support.v4.media.RatingCompat! newThumbRating(boolean);
+ method public static android.support.v4.media.RatingCompat! newUnratedRating(int);
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat>! CREATOR;
+ field public static final int RATING_3_STARS = 3; // 0x3
+ field public static final int RATING_4_STARS = 4; // 0x4
+ field public static final int RATING_5_STARS = 5; // 0x5
+ field public static final int RATING_HEART = 1; // 0x1
+ field public static final int RATING_NONE = 0; // 0x0
+ field public static final int RATING_PERCENTAGE = 6; // 0x6
+ field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
+ }
+
+}
+
+package android.support.v4.media.session {
+
+ public final class MediaControllerCompat {
+ ctor public MediaControllerCompat(android.content.Context!, android.support.v4.media.session.MediaSessionCompat);
+ ctor public MediaControllerCompat(android.content.Context!, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
+ method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat!);
+ method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat!, int);
+ method public void adjustVolume(int, int);
+ method public boolean dispatchMediaButtonEvent(android.view.KeyEvent!);
+ method public android.os.Bundle! getExtras();
+ method public long getFlags();
+ method public static android.support.v4.media.session.MediaControllerCompat! getMediaController(android.app.Activity);
+ method public Object! getMediaController();
+ method public android.support.v4.media.MediaMetadataCompat! getMetadata();
+ method public String! getPackageName();
+ method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo! getPlaybackInfo();
+ method public android.support.v4.media.session.PlaybackStateCompat! getPlaybackState();
+ method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>! getQueue();
+ method public CharSequence! getQueueTitle();
+ method public int getRatingType();
+ method public int getRepeatMode();
+ method public android.app.PendingIntent! getSessionActivity();
+ method public android.support.v4.media.session.MediaSessionCompat.Token! getSessionToken();
+ method public int getShuffleMode();
+ method public android.support.v4.media.session.MediaControllerCompat.TransportControls! getTransportControls();
+ method public boolean isCaptioningEnabled();
+ method public boolean isSessionReady();
+ method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+ method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler!);
+ method public void removeQueueItem(android.support.v4.media.MediaDescriptionCompat!);
+ method @Deprecated public void removeQueueItemAt(int);
+ method public void sendCommand(String, android.os.Bundle?, android.os.ResultReceiver?);
+ method public static void setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat!);
+ method public void setVolumeTo(int, int);
+ method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+ }
+
+ public abstract static class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
+ ctor public MediaControllerCompat.Callback();
+ method public void binderDied();
+ method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo!);
+ method public void onCaptioningEnabledChanged(boolean);
+ method public void onExtrasChanged(android.os.Bundle!);
+ method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat!);
+ method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat!);
+ method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>!);
+ method public void onQueueTitleChanged(CharSequence!);
+ method public void onRepeatModeChanged(int);
+ method public void onSessionDestroyed();
+ method public void onSessionEvent(String!, android.os.Bundle!);
+ method public void onSessionReady();
+ method public void onShuffleModeChanged(int);
+ }
+
+ public static final class MediaControllerCompat.PlaybackInfo {
+ method public androidx.media.AudioAttributesCompat getAudioAttributes();
+ method @Deprecated public int getAudioStream();
+ method public int getCurrentVolume();
+ method public int getMaxVolume();
+ method public int getPlaybackType();
+ method public int getVolumeControl();
+ field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
+ field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
+ }
+
+ public abstract static class MediaControllerCompat.TransportControls {
+ method public abstract void fastForward();
+ method public abstract void pause();
+ method public abstract void play();
+ method public abstract void playFromMediaId(String!, android.os.Bundle!);
+ method public abstract void playFromSearch(String!, android.os.Bundle!);
+ method public abstract void playFromUri(android.net.Uri!, android.os.Bundle!);
+ method public abstract void prepare();
+ method public abstract void prepareFromMediaId(String!, android.os.Bundle!);
+ method public abstract void prepareFromSearch(String!, android.os.Bundle!);
+ method public abstract void prepareFromUri(android.net.Uri!, android.os.Bundle!);
+ method public abstract void rewind();
+ method public abstract void seekTo(long);
+ method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction!, android.os.Bundle!);
+ method public abstract void sendCustomAction(String!, android.os.Bundle!);
+ method public abstract void setCaptioningEnabled(boolean);
+ method public abstract void setRating(android.support.v4.media.RatingCompat!);
+ method public abstract void setRating(android.support.v4.media.RatingCompat!, android.os.Bundle!);
+ method public abstract void setRepeatMode(int);
+ method public abstract void setShuffleMode(int);
+ method public abstract void skipToNext();
+ method public abstract void skipToPrevious();
+ method public abstract void skipToQueueItem(long);
+ method public abstract void stop();
+ field public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+ }
+
+ public class MediaSessionCompat {
+ ctor public MediaSessionCompat(android.content.Context!, String!);
+ ctor public MediaSessionCompat(android.content.Context!, String!, android.content.ComponentName!, android.app.PendingIntent!);
+ method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener!);
+ method public static android.support.v4.media.session.MediaSessionCompat! fromMediaSession(android.content.Context!, Object!);
+ method public android.support.v4.media.session.MediaControllerCompat! getController();
+ method public final androidx.media.MediaSessionManager.RemoteUserInfo getCurrentControllerInfo();
+ method public Object! getMediaSession();
+ method public Object! getRemoteControlClient();
+ method public android.support.v4.media.session.MediaSessionCompat.Token! getSessionToken();
+ method public boolean isActive();
+ method public void release();
+ method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener!);
+ method public void sendSessionEvent(String!, android.os.Bundle!);
+ method public void setActive(boolean);
+ method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback!);
+ method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback!, android.os.Handler!);
+ method public void setCaptioningEnabled(boolean);
+ method public void setExtras(android.os.Bundle!);
+ method public void setFlags(int);
+ method public void setMediaButtonReceiver(android.app.PendingIntent!);
+ method public void setMetadata(android.support.v4.media.MediaMetadataCompat!);
+ method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat!);
+ method public void setPlaybackToLocal(int);
+ method public void setPlaybackToRemote(androidx.media.VolumeProviderCompat!);
+ method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>!);
+ method public void setQueueTitle(CharSequence!);
+ method public void setRatingType(int);
+ method public void setRepeatMode(int);
+ method public void setSessionActivity(android.app.PendingIntent!);
+ method public void setShuffleMode(int);
+ field public static final String ACTION_FLAG_AS_INAPPROPRIATE = "android.support.v4.media.session.action.FLAG_AS_INAPPROPRIATE";
+ field public static final String ACTION_FOLLOW = "android.support.v4.media.session.action.FOLLOW";
+ field public static final String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
+ field public static final String ACTION_UNFOLLOW = "android.support.v4.media.session.action.UNFOLLOW";
+ field public static final String ARGUMENT_MEDIA_ATTRIBUTE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE";
+ field public static final String ARGUMENT_MEDIA_ATTRIBUTE_VALUE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE_VALUE";
+ field @Deprecated public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+ field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
+ field @Deprecated public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+ field public static final int MEDIA_ATTRIBUTE_ALBUM = 1; // 0x1
+ field public static final int MEDIA_ATTRIBUTE_ARTIST = 0; // 0x0
+ field public static final int MEDIA_ATTRIBUTE_PLAYLIST = 2; // 0x2
+ }
+
+ public abstract static class MediaSessionCompat.Callback {
+ ctor public MediaSessionCompat.Callback();
+ method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat!);
+ method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat!, int);
+ method public void onCommand(String!, android.os.Bundle!, android.os.ResultReceiver!);
+ method public void onCustomAction(String!, android.os.Bundle!);
+ method public void onFastForward();
+ method public boolean onMediaButtonEvent(android.content.Intent!);
+ method public void onPause();
+ method public void onPlay();
+ method public void onPlayFromMediaId(String!, android.os.Bundle!);
+ method public void onPlayFromSearch(String!, android.os.Bundle!);
+ method public void onPlayFromUri(android.net.Uri!, android.os.Bundle!);
+ method public void onPrepare();
+ method public void onPrepareFromMediaId(String!, android.os.Bundle!);
+ method public void onPrepareFromSearch(String!, android.os.Bundle!);
+ method public void onPrepareFromUri(android.net.Uri!, android.os.Bundle!);
+ method public void onRemoveQueueItem(android.support.v4.media.MediaDescriptionCompat!);
+ method @Deprecated public void onRemoveQueueItemAt(int);
+ method public void onRewind();
+ method public void onSeekTo(long);
+ method public void onSetCaptioningEnabled(boolean);
+ method public void onSetRating(android.support.v4.media.RatingCompat!);
+ method public void onSetRating(android.support.v4.media.RatingCompat!, android.os.Bundle!);
+ method public void onSetRepeatMode(int);
+ method public void onSetShuffleMode(int);
+ method public void onSkipToNext();
+ method public void onSkipToPrevious();
+ method public void onSkipToQueueItem(long);
+ method public void onStop();
+ }
+
+ public static interface MediaSessionCompat.OnActiveChangeListener {
+ method public void onActiveChanged();
+ }
+
+ public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
+ ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat!, long);
+ method public int describeContents();
+ method public static android.support.v4.media.session.MediaSessionCompat.QueueItem! fromQueueItem(Object!);
+ method public static java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>! fromQueueItemList(java.util.List<?>!);
+ method public android.support.v4.media.MediaDescriptionCompat! getDescription();
+ method public long getQueueId();
+ method public Object! getQueueItem();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem>! CREATOR;
+ field public static final int UNKNOWN_ID = -1; // 0xffffffff
+ }
+
+ public static final class MediaSessionCompat.Token implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.support.v4.media.session.MediaSessionCompat.Token! fromToken(Object!);
+ method public Object! getToken();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token>! CREATOR;
+ }
+
+ public class ParcelableVolumeInfo implements android.os.Parcelable {
+ ctor public ParcelableVolumeInfo(int, int, int, int, int);
+ ctor public ParcelableVolumeInfo(android.os.Parcel!);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo>! CREATOR;
+ field public int audioStream;
+ field public int controlType;
+ field public int currentVolume;
+ field public int maxVolume;
+ field public int volumeType;
+ }
+
+ public final class PlaybackStateCompat implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.support.v4.media.session.PlaybackStateCompat! fromPlaybackState(Object!);
+ method public long getActions();
+ method public long getActiveQueueItemId();
+ method public long getBufferedPosition();
+ method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction>! getCustomActions();
+ method public int getErrorCode();
+ method public CharSequence! getErrorMessage();
+ method public android.os.Bundle? getExtras();
+ method public long getLastPositionUpdateTime();
+ method public float getPlaybackSpeed();
+ method public Object! getPlaybackState();
+ method public long getPosition();
+ method public int getState();
+ method public static int toKeyCode(long);
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
+ field public static final long ACTION_PAUSE = 2L; // 0x2L
+ field public static final long ACTION_PLAY = 4L; // 0x4L
+ field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
+ field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
+ field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
+ field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
+ field public static final long ACTION_PREPARE = 16384L; // 0x4000L
+ field public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768L; // 0x8000L
+ field public static final long ACTION_PREPARE_FROM_SEARCH = 65536L; // 0x10000L
+ field public static final long ACTION_PREPARE_FROM_URI = 131072L; // 0x20000L
+ field public static final long ACTION_REWIND = 8L; // 0x8L
+ field public static final long ACTION_SEEK_TO = 256L; // 0x100L
+ field public static final long ACTION_SET_CAPTIONING_ENABLED = 1048576L; // 0x100000L
+ field public static final long ACTION_SET_RATING = 128L; // 0x80L
+ field public static final long ACTION_SET_REPEAT_MODE = 262144L; // 0x40000L
+ field public static final long ACTION_SET_SHUFFLE_MODE = 2097152L; // 0x200000L
+ field @Deprecated public static final long ACTION_SET_SHUFFLE_MODE_ENABLED = 524288L; // 0x80000L
+ field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
+ field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
+ field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
+ field public static final long ACTION_STOP = 1L; // 0x1L
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat>! CREATOR;
+ field public static final int ERROR_CODE_ACTION_ABORTED = 10; // 0xa
+ field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1
+ field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3
+ field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5
+ field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8
+ field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb
+ field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7
+ field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2
+ field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6
+ field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4
+ field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9
+ field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0
+ field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
+ field public static final int REPEAT_MODE_ALL = 2; // 0x2
+ field public static final int REPEAT_MODE_GROUP = 3; // 0x3
+ field public static final int REPEAT_MODE_INVALID = -1; // 0xffffffff
+ field public static final int REPEAT_MODE_NONE = 0; // 0x0
+ field public static final int REPEAT_MODE_ONE = 1; // 0x1
+ field public static final int SHUFFLE_MODE_ALL = 1; // 0x1
+ field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2
+ field public static final int SHUFFLE_MODE_INVALID = -1; // 0xffffffff
+ field public static final int SHUFFLE_MODE_NONE = 0; // 0x0
+ field public static final int STATE_BUFFERING = 6; // 0x6
+ field public static final int STATE_CONNECTING = 8; // 0x8
+ field public static final int STATE_ERROR = 7; // 0x7
+ field public static final int STATE_FAST_FORWARDING = 4; // 0x4
+ field public static final int STATE_NONE = 0; // 0x0
+ field public static final int STATE_PAUSED = 2; // 0x2
+ field public static final int STATE_PLAYING = 3; // 0x3
+ field public static final int STATE_REWINDING = 5; // 0x5
+ field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
+ field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
+ field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
+ field public static final int STATE_STOPPED = 1; // 0x1
+ }
+
+ public static final class PlaybackStateCompat.Builder {
+ ctor public PlaybackStateCompat.Builder();
+ ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat!);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! addCustomAction(String!, String!, int);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction!);
+ method public android.support.v4.media.session.PlaybackStateCompat! build();
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setActions(long);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setActiveQueueItemId(long);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setBufferedPosition(long);
+ method @Deprecated public android.support.v4.media.session.PlaybackStateCompat.Builder! setErrorMessage(CharSequence!);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setErrorMessage(int, CharSequence!);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setExtras(android.os.Bundle!);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setState(int, long, float);
+ method public android.support.v4.media.session.PlaybackStateCompat.Builder! setState(int, long, float, long);
+ }
+
+ public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction! fromCustomAction(Object!);
+ method public String! getAction();
+ method public Object! getCustomAction();
+ method public android.os.Bundle! getExtras();
+ method public int getIcon();
+ method public CharSequence! getName();
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction>! CREATOR;
+ }
+
+ public static final class PlaybackStateCompat.CustomAction.Builder {
+ ctor public PlaybackStateCompat.CustomAction.Builder(String!, CharSequence!, int);
+ method public android.support.v4.media.session.PlaybackStateCompat.CustomAction! build();
+ method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder! setExtras(android.os.Bundle!);
+ }
+
+}
+
+package androidx.media {
+
+ public class AudioAttributesCompat implements androidx.versionedparcelable.VersionedParcelable {
+ method public int getContentType();
+ method public int getFlags();
+ method public int getLegacyStreamType();
+ method public int getUsage();
+ method public int getVolumeControlStream();
+ method public Object? unwrap();
+ method public static androidx.media.AudioAttributesCompat? wrap(Object);
+ field public static final int CONTENT_TYPE_MOVIE = 3; // 0x3
+ field public static final int CONTENT_TYPE_MUSIC = 2; // 0x2
+ field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
+ field public static final int CONTENT_TYPE_SPEECH = 1; // 0x1
+ field public static final int CONTENT_TYPE_UNKNOWN = 0; // 0x0
+ field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
+ field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
+ field public static final int USAGE_ALARM = 4; // 0x4
+ field public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; // 0xb
+ field public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; // 0xc
+ field public static final int USAGE_ASSISTANCE_SONIFICATION = 13; // 0xd
+ field public static final int USAGE_ASSISTANT = 16; // 0x10
+ field public static final int USAGE_GAME = 14; // 0xe
+ field public static final int USAGE_MEDIA = 1; // 0x1
+ field public static final int USAGE_NOTIFICATION = 5; // 0x5
+ field public static final int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9; // 0x9
+ field public static final int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8; // 0x8
+ field public static final int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7; // 0x7
+ field public static final int USAGE_NOTIFICATION_EVENT = 10; // 0xa
+ field public static final int USAGE_NOTIFICATION_RINGTONE = 6; // 0x6
+ field public static final int USAGE_UNKNOWN = 0; // 0x0
+ field public static final int USAGE_VOICE_COMMUNICATION = 2; // 0x2
+ field public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3; // 0x3
+ }
+
+ public static class AudioAttributesCompat.Builder {
+ ctor public AudioAttributesCompat.Builder();
+ ctor public AudioAttributesCompat.Builder(androidx.media.AudioAttributesCompat!);
+ method public androidx.media.AudioAttributesCompat! build();
+ method public androidx.media.AudioAttributesCompat.Builder! setContentType(int);
+ method public androidx.media.AudioAttributesCompat.Builder! setFlags(int);
+ method public androidx.media.AudioAttributesCompat.Builder! setLegacyStreamType(int);
+ method public androidx.media.AudioAttributesCompat.Builder! setUsage(int);
+ }
+
+ public class AudioFocusRequestCompat {
+ method public androidx.media.AudioAttributesCompat getAudioAttributesCompat();
+ method public android.os.Handler getFocusChangeHandler();
+ method public int getFocusGain();
+ method public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
+ method public boolean willPauseWhenDucked();
+ }
+
+ public static final class AudioFocusRequestCompat.Builder {
+ ctor public AudioFocusRequestCompat.Builder(int);
+ ctor public AudioFocusRequestCompat.Builder(androidx.media.AudioFocusRequestCompat);
+ method public androidx.media.AudioFocusRequestCompat! build();
+ method public androidx.media.AudioFocusRequestCompat.Builder setAudioAttributes(androidx.media.AudioAttributesCompat);
+ method public androidx.media.AudioFocusRequestCompat.Builder setFocusGain(int);
+ method public androidx.media.AudioFocusRequestCompat.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public androidx.media.AudioFocusRequestCompat.Builder setOnAudioFocusChangeListener(android.media.AudioManager.OnAudioFocusChangeListener, android.os.Handler);
+ method public androidx.media.AudioFocusRequestCompat.Builder setWillPauseWhenDucked(boolean);
+ }
+
+ public final class AudioManagerCompat {
+ method public static int abandonAudioFocusRequest(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
+ method public static int requestAudioFocus(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
+ field public static final int AUDIOFOCUS_GAIN = 1; // 0x1
+ field public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2; // 0x2
+ field public static final int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE = 4; // 0x4
+ field public static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = 3; // 0x3
+ }
+
+ public abstract class MediaBrowserServiceCompat extends android.app.Service {
+ ctor public MediaBrowserServiceCompat();
+ method public void dump(java.io.FileDescriptor!, java.io.PrintWriter!, String[]!);
+ method public final android.os.Bundle! getBrowserRootHints();
+ method public final androidx.media.MediaSessionManager.RemoteUserInfo getCurrentBrowserInfo();
+ method public android.support.v4.media.session.MediaSessionCompat.Token? getSessionToken();
+ method public void notifyChildrenChanged(String);
+ method public void notifyChildrenChanged(String, android.os.Bundle);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ method public void onCustomAction(String, android.os.Bundle!, androidx.media.MediaBrowserServiceCompat.Result<android.os.Bundle>);
+ method public abstract androidx.media.MediaBrowserServiceCompat.BrowserRoot? onGetRoot(String, int, android.os.Bundle?);
+ method public abstract void onLoadChildren(String, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+ method public void onLoadChildren(String, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>, android.os.Bundle);
+ method public void onLoadItem(String!, androidx.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+ method public void onSearch(String, android.os.Bundle!, androidx.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+ method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token!);
+ field public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+ }
+
+ public static final class MediaBrowserServiceCompat.BrowserRoot {
+ ctor public MediaBrowserServiceCompat.BrowserRoot(String, android.os.Bundle?);
+ method public android.os.Bundle! getExtras();
+ method public String! getRootId();
+ field public static final String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+ field public static final String EXTRA_RECENT = "android.service.media.extra.RECENT";
+ field public static final String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+ field @Deprecated public static final String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
+ }
+
+ public static class MediaBrowserServiceCompat.Result<T> {
+ method public void detach();
+ method public void sendError(android.os.Bundle!);
+ method public void sendProgressUpdate(android.os.Bundle!);
+ method public void sendResult(T!);
+ }
+
+ public final class MediaSessionManager {
+ method public static androidx.media.MediaSessionManager getSessionManager(android.content.Context);
+ method public boolean isTrustedForMediaControl(androidx.media.MediaSessionManager.RemoteUserInfo);
+ }
+
+ public static final class MediaSessionManager.RemoteUserInfo {
+ ctor public MediaSessionManager.RemoteUserInfo(String, int, int);
+ method public String getPackageName();
+ method public int getPid();
+ method public int getUid();
+ field public static final String LEGACY_CONTROLLER = "android.media.session.MediaController";
+ }
+
+ public abstract class VolumeProviderCompat {
+ ctor public VolumeProviderCompat(int, int, int);
+ method public final int getCurrentVolume();
+ method public final int getMaxVolume();
+ method public final int getVolumeControl();
+ method public Object! getVolumeProvider();
+ method public void onAdjustVolume(int);
+ method public void onSetVolumeTo(int);
+ method public void setCallback(androidx.media.VolumeProviderCompat.Callback!);
+ method public final void setCurrentVolume(int);
+ field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
+ field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
+ field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
+ }
+
+ public abstract static class VolumeProviderCompat.Callback {
+ ctor public VolumeProviderCompat.Callback();
+ method public abstract void onVolumeChanged(androidx.media.VolumeProviderCompat!);
+ }
+
+}
+
+package androidx.media.app {
+
+ public class NotificationCompat {
+ }
+
+ public static class NotificationCompat.DecoratedMediaCustomViewStyle extends androidx.media.app.NotificationCompat.MediaStyle {
+ ctor public NotificationCompat.DecoratedMediaCustomViewStyle();
+ }
+
+ public static class NotificationCompat.MediaStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.MediaStyle();
+ ctor public NotificationCompat.MediaStyle(androidx.core.app.NotificationCompat.Builder!);
+ method public static android.support.v4.media.session.MediaSessionCompat.Token! getMediaSession(android.app.Notification!);
+ method public androidx.media.app.NotificationCompat.MediaStyle! setCancelButtonIntent(android.app.PendingIntent!);
+ method public androidx.media.app.NotificationCompat.MediaStyle! setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token!);
+ method public androidx.media.app.NotificationCompat.MediaStyle! setShowActionsInCompactView(int...!);
+ method public androidx.media.app.NotificationCompat.MediaStyle! setShowCancelButton(boolean);
+ }
+
+}
+
+package androidx.media.session {
+
+ public class MediaButtonReceiver extends android.content.BroadcastReceiver {
+ ctor public MediaButtonReceiver();
+ method public static android.app.PendingIntent! buildMediaButtonPendingIntent(android.content.Context!, long);
+ method public static android.app.PendingIntent! buildMediaButtonPendingIntent(android.content.Context!, android.content.ComponentName!, long);
+ method public static android.view.KeyEvent! handleIntent(android.support.v4.media.session.MediaSessionCompat!, android.content.Intent!);
+ method public void onReceive(android.content.Context!, android.content.Intent!);
+ }
+
+}
+
diff --git a/media/api/res-1.1.0-alpha02.txt b/media/api/res-1.1.0-alpha02.txt
new file mode 100644
index 0000000..7a1e44d
--- /dev/null
+++ b/media/api/res-1.1.0-alpha02.txt
@@ -0,0 +1,5 @@
+style TextAppearance_Compat_Notification_Info_Media
+style TextAppearance_Compat_Notification_Line2_Media
+style TextAppearance_Compat_Notification_Media
+style TextAppearance_Compat_Notification_Time_Media
+style TextAppearance_Compat_Notification_Title_Media
diff --git a/media/build.gradle b/media/build.gradle
index 28222d7..6564ea6 100644
--- a/media/build.gradle
+++ b/media/build.gradle
@@ -7,7 +7,7 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.1")
+ api(project(":annotation"))
api(project(":core"))
implementation(project(":collection"))
api("androidx.versionedparcelable:versionedparcelable:1.1.0-alpha01")
diff --git a/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java b/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java
index 2ab22a5..12f7083 100644
--- a/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java
@@ -16,7 +16,7 @@
package android.support.v4.media;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media.MediaBrowserProtocol.CLIENT_MSG_ADD_SUBSCRIPTION;
import static androidx.media.MediaBrowserProtocol.CLIENT_MSG_CONNECT;
import static androidx.media.MediaBrowserProtocol.CLIENT_MSG_DISCONNECT;
@@ -461,7 +461,7 @@
private final MediaDescriptionCompat mDescription;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag=true, value = { FLAG_BROWSABLE, FLAG_PLAYABLE })
public @interface Flags { }
diff --git a/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java b/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
index 4fe7886..e34708f 100644
--- a/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
+++ b/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
@@ -15,7 +15,7 @@
*/
package android.support.v4.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
@@ -140,7 +140,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String DESCRIPTION_KEY_MEDIA_URI =
"android.support.v4.media.description.MEDIA_URI";
/**
@@ -148,7 +148,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String DESCRIPTION_KEY_NULL_BUNDLE_FLAG =
"android.support.v4.media.description.NULL_BUNDLE_FLAG";
/**
diff --git a/media/src/main/java/android/support/v4/media/MediaMetadataCompat.java b/media/src/main/java/android/support/v4/media/MediaMetadataCompat.java
index f3d7e45..bf8b780 100644
--- a/media/src/main/java/android/support/v4/media/MediaMetadataCompat.java
+++ b/media/src/main/java/android/support/v4/media/MediaMetadataCompat.java
@@ -15,7 +15,7 @@
*/
package android.support.v4.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
@@ -265,7 +265,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef(value =
{METADATA_KEY_TITLE, METADATA_KEY_ARTIST, METADATA_KEY_ALBUM, METADATA_KEY_AUTHOR,
METADATA_KEY_WRITER, METADATA_KEY_COMPOSER, METADATA_KEY_COMPILATION,
@@ -280,7 +280,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef(value =
{METADATA_KEY_DURATION, METADATA_KEY_YEAR, METADATA_KEY_TRACK_NUMBER,
METADATA_KEY_NUM_TRACKS, METADATA_KEY_DISC_NUMBER, METADATA_KEY_BT_FOLDER_TYPE,
@@ -292,7 +292,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_ART, METADATA_KEY_ALBUM_ART, METADATA_KEY_DISPLAY_ICON})
@Retention(RetentionPolicy.SOURCE)
public @interface BitmapKey {}
@@ -300,7 +300,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_USER_RATING, METADATA_KEY_RATING})
@Retention(RetentionPolicy.SOURCE)
public @interface RatingKey {}
@@ -695,7 +695,7 @@
* in the metadata.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder(MediaMetadataCompat source, int maxBitmapSize) {
this(source);
for (String key : mBundle.keySet()) {
diff --git a/media/src/main/java/android/support/v4/media/RatingCompat.java b/media/src/main/java/android/support/v4/media/RatingCompat.java
index 6f8a0b1..d109647 100644
--- a/media/src/main/java/android/support/v4/media/RatingCompat.java
+++ b/media/src/main/java/android/support/v4/media/RatingCompat.java
@@ -16,7 +16,7 @@
package android.support.v4.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.media.Rating;
@@ -46,7 +46,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({RATING_NONE, RATING_HEART, RATING_THUMB_UP_DOWN, RATING_3_STARS, RATING_4_STARS,
RATING_5_STARS, RATING_PERCENTAGE})
@Retention(RetentionPolicy.SOURCE)
@@ -55,7 +55,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({RATING_3_STARS, RATING_4_STARS, RATING_5_STARS})
@Retention(RetentionPolicy.SOURCE)
public @interface StarStyle {}
diff --git a/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java b/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
index e4cd404..e7963eb 100644
--- a/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -17,7 +17,7 @@
package android.support.v4.media.session;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.app.PendingIntent;
@@ -541,7 +541,7 @@
* @return The session's token as VersionedParcelable.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @Nullable VersionedParcelable getSession2Token() {
return mToken.getSession2Token();
}
diff --git a/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java b/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
index a9188e8..4b468c6 100644
--- a/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -17,7 +17,7 @@
package android.support.v4.media.session;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media.MediaSessionManager.RemoteUserInfo.LEGACY_CONTROLLER;
import static androidx.media.MediaSessionManager.RemoteUserInfo.UNKNOWN_PID;
import static androidx.media.MediaSessionManager.RemoteUserInfo.UNKNOWN_UID;
@@ -128,7 +128,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(flag=true, value={
FLAG_HANDLES_MEDIA_BUTTONS,
FLAG_HANDLES_TRANSPORT_CONTROLS,
@@ -404,7 +404,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String KEY_TOKEN = "android.support.v4.media.session.TOKEN";
/**
@@ -417,7 +417,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String KEY_SESSION2_TOKEN =
"android.support.v4.media.session.SESSION_TOKEN2";
@@ -480,7 +480,7 @@
* @hide
* Creates session for MediaSession.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaSessionCompat(Context context, String tag, VersionedParcelable session2Token) {
this(context, tag, null, null, session2Token);
}
@@ -895,7 +895,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public String getCallingPackage() {
return mImpl.getCallingPackage();
}
@@ -962,7 +962,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void ensureClassLoader(@Nullable Bundle bundle) {
if (bundle != null) {
bundle.setClassLoader(MediaSessionCompat.class.getClassLoader());
@@ -1701,7 +1701,7 @@
* @return A compat Token for use with {@link MediaControllerCompat}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Token fromToken(Object token, IMediaSession extraBinder) {
if (token != null && android.os.Build.VERSION.SDK_INT >= 21) {
if (!(token instanceof MediaSession.Token)) {
@@ -1770,7 +1770,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public IMediaSession getExtraBinder() {
return mExtraBinder;
}
@@ -1778,7 +1778,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setExtraBinder(IMediaSession extraBinder) {
mExtraBinder = extraBinder;
}
@@ -1786,7 +1786,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public VersionedParcelable getSession2Token() {
return mSession2Token;
}
@@ -1794,7 +1794,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setSession2Token(VersionedParcelable session2Token) {
mSession2Token = session2Token;
}
@@ -1802,7 +1802,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Bundle toBundle() {
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_TOKEN, this);
@@ -1822,7 +1822,7 @@
* @return A compat Token for use with {@link MediaControllerCompat}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Token fromBundle(Bundle tokenBundle) {
if (tokenBundle == null) {
return null;
diff --git a/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java b/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
index 8e88f48..57a3302 100644
--- a/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
+++ b/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
@@ -15,7 +15,7 @@
*/
package android.support.v4.media.session;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.media.session.PlaybackState;
@@ -48,7 +48,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@LongDef(flag=true, value={ACTION_STOP, ACTION_PAUSE, ACTION_PLAY, ACTION_REWIND,
ACTION_SKIP_TO_PREVIOUS, ACTION_SKIP_TO_NEXT, ACTION_FAST_FORWARD, ACTION_SET_RATING,
ACTION_SEEK_TO, ACTION_PLAY_PAUSE, ACTION_PLAY_FROM_MEDIA_ID, ACTION_PLAY_FROM_SEARCH,
@@ -61,7 +61,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@LongDef({ACTION_STOP, ACTION_PAUSE, ACTION_PLAY, ACTION_REWIND, ACTION_SKIP_TO_PREVIOUS,
ACTION_SKIP_TO_NEXT, ACTION_FAST_FORWARD, ACTION_PLAY_PAUSE})
@Retention(RetentionPolicy.SOURCE)
@@ -226,7 +226,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({STATE_NONE, STATE_STOPPED, STATE_PAUSED, STATE_PLAYING, STATE_FAST_FORWARDING,
STATE_REWINDING, STATE_BUFFERING, STATE_ERROR, STATE_CONNECTING,
STATE_SKIPPING_TO_PREVIOUS, STATE_SKIPPING_TO_NEXT, STATE_SKIPPING_TO_QUEUE_ITEM})
@@ -339,7 +339,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({REPEAT_MODE_INVALID, REPEAT_MODE_NONE, REPEAT_MODE_ONE, REPEAT_MODE_ALL,
REPEAT_MODE_GROUP})
@Retention(RetentionPolicy.SOURCE)
@@ -380,7 +380,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({SHUFFLE_MODE_INVALID, SHUFFLE_MODE_NONE, SHUFFLE_MODE_ALL, SHUFFLE_MODE_GROUP})
@Retention(RetentionPolicy.SOURCE)
public @interface ShuffleMode {}
@@ -414,7 +414,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({ERROR_CODE_UNKNOWN_ERROR, ERROR_CODE_APP_ERROR, ERROR_CODE_NOT_SUPPORTED,
ERROR_CODE_AUTHENTICATION_EXPIRED, ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED,
ERROR_CODE_CONCURRENT_STREAM_LIMIT, ERROR_CODE_PARENTAL_CONTROL_RESTRICTED,
@@ -668,7 +668,7 @@
* @return The current playback position in ms
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public long getCurrentPosition(Long timeDiff) {
long expectedPosition = mPosition + (long) (mSpeed * (
(timeDiff != null) ? timeDiff : SystemClock.elapsedRealtime() - mUpdateTime));
diff --git a/media/src/main/java/androidx/media/AudioAttributesCompat.java b/media/src/main/java/androidx/media/AudioAttributesCompat.java
index 9e6f75e..4984976 100644
--- a/media/src/main/java/androidx/media/AudioAttributesCompat.java
+++ b/media/src/main/java/androidx/media/AudioAttributesCompat.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.media.AudioAttributes;
import android.media.AudioManager;
@@ -248,7 +248,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(1)
public AudioAttributesImpl mImpl;
@@ -350,7 +350,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @NonNull Bundle toBundle() {
return mImpl.toBundle();
}
@@ -358,7 +358,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static AudioAttributesCompat fromBundle(Bundle bundle) {
AudioAttributesImpl impl;
if (Build.VERSION.SDK_INT >= 21) {
@@ -571,7 +571,7 @@
*
* @hide For testing only.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void setForceLegacyBehavior(boolean force) {
sForceLegacyBehavior = force;
}
@@ -664,7 +664,7 @@
USAGE_GAME,
USAGE_ASSISTANT,
})
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
public @interface AttributeUsage {
}
@@ -678,7 +678,7 @@
CONTENT_TYPE_SONIFICATION
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface AttributeContentType {
}
}
diff --git a/media/src/main/java/androidx/media/AudioAttributesImplApi21.java b/media/src/main/java/androidx/media/AudioAttributesImplApi21.java
index abd68a6..88f7ab2 100644
--- a/media/src/main/java/androidx/media/AudioAttributesImplApi21.java
+++ b/media/src/main/java/androidx/media/AudioAttributesImplApi21.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media.AudioAttributesCompat.AUDIO_ATTRIBUTES_FRAMEWORKS;
import static androidx.media.AudioAttributesCompat.AUDIO_ATTRIBUTES_LEGACY_STREAM_TYPE;
import static androidx.media.AudioAttributesCompat.INVALID_STREAM_TYPE;
@@ -33,18 +33,18 @@
/** @hide */
@VersionedParcelize(jetifyAs = "android.support.v4.media.AudioAttributesImplApi21")
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(21)
public class AudioAttributesImplApi21 implements AudioAttributesImpl {
private static final String TAG = "AudioAttributesCompat21";
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(1)
public AudioAttributes mAudioAttributes;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(2)
public int mLegacyStreamType = INVALID_STREAM_TYPE;
diff --git a/media/src/main/java/androidx/media/AudioAttributesImplApi26.java b/media/src/main/java/androidx/media/AudioAttributesImplApi26.java
index a961e84..12e14cb 100644
--- a/media/src/main/java/androidx/media/AudioAttributesImplApi26.java
+++ b/media/src/main/java/androidx/media/AudioAttributesImplApi26.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media.AudioAttributesCompat.INVALID_STREAM_TYPE;
import android.media.AudioAttributes;
@@ -27,7 +27,7 @@
/** @hide */
@VersionedParcelize(jetifyAs = "android.support.v4.media.AudioAttributesImplApi26")
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(26)
public class AudioAttributesImplApi26 extends AudioAttributesImplApi21 {
private static final String TAG = "AudioAttributesCompat26";
diff --git a/media/src/main/java/androidx/media/AudioAttributesImplBase.java b/media/src/main/java/androidx/media/AudioAttributesImplBase.java
index 45bd889..151eb35 100644
--- a/media/src/main/java/androidx/media/AudioAttributesImplBase.java
+++ b/media/src/main/java/androidx/media/AudioAttributesImplBase.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media.AudioAttributesCompat.AUDIO_ATTRIBUTES_CONTENT_TYPE;
import static androidx.media.AudioAttributesCompat.AUDIO_ATTRIBUTES_FLAGS;
import static androidx.media.AudioAttributesCompat.AUDIO_ATTRIBUTES_LEGACY_STREAM_TYPE;
@@ -57,22 +57,22 @@
/** @hide */
@VersionedParcelize(jetifyAs = "android.support.v4.media.AudioAttributesImplBase")
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AudioAttributesImplBase implements AudioAttributesImpl {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(1)
public int mUsage = USAGE_UNKNOWN;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(2)
public int mContentType = CONTENT_TYPE_UNKNOWN;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(3)
public int mFlags = 0x0;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ParcelField(4)
public int mLegacyStream = INVALID_STREAM_TYPE;
diff --git a/media/src/main/java/androidx/media/AudioFocusRequestCompat.java b/media/src/main/java/androidx/media/AudioFocusRequestCompat.java
index da95c3f..e932d63 100644
--- a/media/src/main/java/androidx/media/AudioFocusRequestCompat.java
+++ b/media/src/main/java/androidx/media/AudioFocusRequestCompat.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -46,7 +46,7 @@
new AudioAttributesCompat.Builder().setUsage(AudioAttributesCompat.USAGE_MEDIA).build();
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(SOURCE)
@IntDef({
AudioManagerCompat.AUDIOFOCUS_GAIN,
@@ -394,7 +394,7 @@
* @return true if focusGain is a valid value for an audio focus request.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
static boolean isValidFocusGain(@FocusGainType int focusGain) {
switch (focusGain) {
case AudioManagerCompat.AUDIOFOCUS_GAIN:
diff --git a/media/src/main/java/androidx/media/MediaBrowserCompatUtils.java b/media/src/main/java/androidx/media/MediaBrowserCompatUtils.java
index b9491b6..0ca95e8 100644
--- a/media/src/main/java/androidx/media/MediaBrowserCompatUtils.java
+++ b/media/src/main/java/androidx/media/MediaBrowserCompatUtils.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.support.v4.media.MediaBrowserCompat;
@@ -26,7 +26,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MediaBrowserCompatUtils {
public static boolean areSameOptions(Bundle options1, Bundle options2) {
if (options1 == options2) {
diff --git a/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java b/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
index 2938c1d..b2da6c8 100644
--- a/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
+++ b/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
@@ -17,7 +17,7 @@
package androidx.media;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media.MediaBrowserProtocol.CLIENT_MSG_ADD_SUBSCRIPTION;
import static androidx.media.MediaBrowserProtocol.CLIENT_MSG_CONNECT;
import static androidx.media.MediaBrowserProtocol.CLIENT_MSG_DISCONNECT;
@@ -1419,7 +1419,7 @@
* @param option option
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void onSubscribe(String id, Bundle option) {
}
@@ -1429,7 +1429,7 @@
* @param id
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void onUnsubscribe(String id) {
}
@@ -1613,7 +1613,7 @@
* contain the information about the change.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void notifyChildrenChanged(@NonNull RemoteUserInfo remoteUserInfo,
@NonNull String parentId, @NonNull Bundle options) {
if (remoteUserInfo == null) {
diff --git a/media/src/main/java/androidx/media/MediaSessionManager.java b/media/src/main/java/androidx/media/MediaSessionManager.java
index ba9d256..c8acdae 100644
--- a/media/src/main/java/androidx/media/MediaSessionManager.java
+++ b/media/src/main/java/androidx/media/MediaSessionManager.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.os.Build;
@@ -127,14 +127,14 @@
* Represents an unknown pid of an application.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int UNKNOWN_PID = -1;
/**
* Represents an unknown uid of an application.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int UNKNOWN_UID = -1;
RemoteUserInfoImpl mImpl;
@@ -168,7 +168,7 @@
* @param remoteUserInfo Framework RemoteUserInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(28)
public RemoteUserInfo(
android.media.session.MediaSessionManager.RemoteUserInfo remoteUserInfo) {
diff --git a/media/src/main/java/androidx/media/VolumeProviderCompat.java b/media/src/main/java/androidx/media/VolumeProviderCompat.java
index 4ddc486..eea4c7b 100644
--- a/media/src/main/java/androidx/media/VolumeProviderCompat.java
+++ b/media/src/main/java/androidx/media/VolumeProviderCompat.java
@@ -16,7 +16,7 @@
package androidx.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.media.VolumeProvider;
import android.os.Build;
@@ -39,7 +39,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({VOLUME_CONTROL_FIXED, VOLUME_CONTROL_RELATIVE, VOLUME_CONTROL_ABSOLUTE})
@Retention(RetentionPolicy.SOURCE)
public @interface ControlType {}
diff --git a/media/src/main/java/androidx/media/app/NotificationCompat.java b/media/src/main/java/androidx/media/app/NotificationCompat.java
index 99c97e4..9e6af2e 100644
--- a/media/src/main/java/androidx/media/app/NotificationCompat.java
+++ b/media/src/main/java/androidx/media/app/NotificationCompat.java
@@ -16,7 +16,7 @@
package androidx.media.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.app.NotificationCompat.COLOR_DEFAULT;
import android.app.Notification;
@@ -204,7 +204,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 21) {
@@ -229,7 +229,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 21) {
@@ -297,7 +297,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 21) {
@@ -382,7 +382,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void apply(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -396,7 +396,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -438,7 +438,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
@@ -470,7 +470,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {
if (Build.VERSION.SDK_INT >= 24) {
diff --git a/media2-widget/src/androidTest/java/androidx/media2/widget/MediaControlViewTest.java b/media2-widget/src/androidTest/java/androidx/media2/widget/MediaControlViewTest.java
index f6bd5cc..9b856c7 100644
--- a/media2-widget/src/androidTest/java/androidx/media2/widget/MediaControlViewTest.java
+++ b/media2-widget/src/androidTest/java/androidx/media2/widget/MediaControlViewTest.java
@@ -21,7 +21,9 @@
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withParent;
+import static org.hamcrest.CoreMatchers.allOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -145,7 +147,8 @@
}
});
assertTrue(latchForPausedState.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
- onView(withId(R.id.pause)).perform(click());
+ onView(allOf((withId(R.id.pause)),
+ withParent(withId(R.id.full_transport_controls)))).perform(click());
assertTrue(latchForPlayingState.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
}
@@ -178,7 +181,8 @@
}
});
assertTrue(latchForPausedState.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
- onView(withId(R.id.ffwd)).perform(click());
+ onView(allOf((withId(R.id.ffwd)),
+ withParent(withId(R.id.full_transport_controls)))).perform(click());
assertTrue(latchForFfwd.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
}
@@ -186,34 +190,39 @@
public void testRewButtonClick() throws Throwable {
final CountDownLatch latchForFfwd = new CountDownLatch(1);
final CountDownLatch latchForRew = new CountDownLatch(1);
- final MediaController controller =
- createController(new MediaController.ControllerCallback() {
- long mExpectedPosition;
- final long mDelta = 1000L;
- @Override
- public void onPlayerStateChanged(@NonNull MediaController controller,
- int state) {
- if (state == SessionPlayer.PLAYER_STATE_PAUSED) {
- mExpectedPosition = FFWD_MS;
- controller.seekTo(mExpectedPosition);
- }
- }
- @Override
- public void onSeekCompleted(@NonNull MediaController controller,
- long position) {
- assertTrue(equalsSeekPosition(mExpectedPosition, position, mDelta));
- if (mExpectedPosition == FFWD_MS) {
- mExpectedPosition = position - REW_MS;
- latchForFfwd.countDown();
- } else {
- latchForRew.countDown();
- }
- }
+ createController(new MediaController.ControllerCallback() {
+ long mExpectedPosition = FFWD_MS;
+ final long mDelta = 1000L;
- private boolean equalsSeekPosition(long expected, long actual, long delta) {
- return (actual < expected + delta) && (actual > expected - delta);
- }
- });
+ @Override
+ public void onPlayerStateChanged(@NonNull MediaController controller,
+ int state) {
+ if (state == SessionPlayer.PLAYER_STATE_PAUSED) {
+ mExpectedPosition = FFWD_MS;
+ controller.seekTo(mExpectedPosition);
+ }
+ }
+
+ @Override
+ public void onSeekCompleted(@NonNull MediaController controller,
+ long position) {
+ // Ignore the initial seek. Internal MediaPlayer behavior can be changed.
+ if (position == 0 && mExpectedPosition == FFWD_MS) {
+ return;
+ }
+ assertTrue(equalsSeekPosition(mExpectedPosition, position, mDelta));
+ if (mExpectedPosition == FFWD_MS) {
+ mExpectedPosition = position - REW_MS;
+ latchForFfwd.countDown();
+ } else {
+ latchForRew.countDown();
+ }
+ }
+
+ private boolean equalsSeekPosition(long expected, long actual, long delta) {
+ return (actual < expected + delta) && (actual > expected - delta);
+ }
+ });
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
@@ -221,7 +230,8 @@
}
});
assertTrue(latchForFfwd.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
- onView(withId(R.id.rew)).perform(click());
+ onView(allOf((withId(R.id.rew)),
+ withParent(withId(R.id.full_transport_controls)))).perform(click());
assertTrue(latchForRew.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
}
diff --git a/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java b/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
index bfa3dde..07ceb15 100644
--- a/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
+++ b/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
@@ -151,7 +151,8 @@
// Int for defining the UX state where the views are being animated (shown or hidden).
private static final int UX_STATE_ANIMATING = 3;
- private static final long DEFAULT_SHOW_CONTROLLER_INTERVAL_MS = 2000;
+ private static final long DISABLE_DELAYED_ANIMATION = -1;
+ private static final long DEFAULT_DELAYED_ANIMATION_INTERVAL_MS = 2000;
private static final long DEFAULT_PROGRESS_UPDATE_TIME_MS = 1000;
private static final long REWIND_TIME_MS = 10000;
private static final long FORWARD_TIME_MS = 30000;
@@ -183,7 +184,7 @@
int mSizeType = SIZE_TYPE_UNDEFINED;
int mUxState;
long mDuration;
- long mShowControllerIntervalMs;
+ long mDelayedAnimationIntervalMs;
long mCurrentSeekPosition;
long mNextSeekPosition;
boolean mDragging;
@@ -275,7 +276,7 @@
mController = new Controller();
inflate(context, R.layout.media_controller, this);
initControllerView();
- mShowControllerIntervalMs = DEFAULT_SHOW_CONTROLLER_INTERVAL_MS;
+ mDelayedAnimationIntervalMs = DEFAULT_DELAYED_ANIMATION_INTERVAL_MS;
mAccessibilityManager = (AccessibilityManager) context.getSystemService(
Context.ACCESSIBILITY_SERVICE);
}
@@ -331,7 +332,11 @@
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
if (mMediaType != MEDIA_TYPE_MUSIC || mSizeType != SIZE_TYPE_FULL) {
- toggleMediaControlViewVisibility();
+ if (mUxState == UX_STATE_ALL_VISIBLE) {
+ hideMediaControlView();
+ } else {
+ showMediaControlView();
+ }
}
}
return true;
@@ -341,7 +346,11 @@
public boolean onTrackballEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
if (mMediaType != MEDIA_TYPE_MUSIC || mSizeType != SIZE_TYPE_FULL) {
- toggleMediaControlViewVisibility();
+ if (mUxState == UX_STATE_ALL_VISIBLE) {
+ hideMediaControlView();
+ } else {
+ showMediaControlView();
+ }
}
}
return true;
@@ -526,8 +535,8 @@
}
}
- void setShowControllerInterval(long interval) {
- mShowControllerIntervalMs = interval;
+ void setDelayedAnimationInterval(long interval) {
+ mDelayedAnimationIntervalMs = interval;
}
///////////////////////////////////////////////////
@@ -808,7 +817,7 @@
boolean isShowing = getVisibility() == View.VISIBLE;
if (!mDragging && isShowing && mController.isPlaying()) {
long pos = setProgress();
- postDelayed(mUpdateProgress,
+ postDelayedRunnable(mUpdateProgress,
DEFAULT_PROGRESS_UPDATE_TIME_MS - (pos % DEFAULT_PROGRESS_UPDATE_TIME_MS));
}
}
@@ -909,33 +918,36 @@
}
}
- private void toggleMediaControlViewVisibility() {
- if (shouldNotHideBars() || mShowControllerIntervalMs == 0
- || mUxState == UX_STATE_ANIMATING) {
+ private void showMediaControlView() {
+ if (mUxState == UX_STATE_ANIMATING) {
return;
}
removeCallbacks(mHideMainBars);
removeCallbacks(mHideProgressBar);
- switch (mUxState) {
- case UX_STATE_NONE_VISIBLE:
- post(mShowAllBars);
- break;
- case UX_STATE_ONLY_PROGRESS_VISIBLE:
- post(mShowMainBars);
- break;
- case UX_STATE_ALL_VISIBLE:
- post(mHideAllBars);
- break;
+ if (mUxState == UX_STATE_NONE_VISIBLE) {
+ post(mShowAllBars);
+ } else if (mUxState == UX_STATE_ONLY_PROGRESS_VISIBLE) {
+ post(mShowMainBars);
}
}
+ private void hideMediaControlView() {
+ if (shouldNotHideBars() || mUxState == UX_STATE_ANIMATING) {
+ return;
+ }
+ removeCallbacks(mHideMainBars);
+ removeCallbacks(mHideProgressBar);
+
+ post(mHideAllBars);
+ }
+
private final Runnable mShowAllBars = new Runnable() {
@Override
public void run() {
mShowAllBarsAnimator.start();
if (mController.isPlaying()) {
- postDelayed(mHideMainBars, mShowControllerIntervalMs);
+ postDelayedRunnable(mHideMainBars, mDelayedAnimationIntervalMs);
}
}
};
@@ -944,7 +956,7 @@
@Override
public void run() {
mShowMainBarsAnimator.start();
- postDelayed(mHideMainBars, mShowControllerIntervalMs);
+ postDelayedRunnable(mHideMainBars, mDelayedAnimationIntervalMs);
}
};
@@ -965,7 +977,7 @@
return;
}
mHideMainBarsAnimator.start();
- postDelayed(mHideProgressBar, mShowControllerIntervalMs);
+ postDelayedRunnable(mHideProgressBar, mDelayedAnimationIntervalMs);
}
};
@@ -1256,7 +1268,7 @@
@Override
public void onDismiss() {
if (mNeedToHideBars) {
- postDelayed(mHideMainBars, mShowControllerIntervalMs);
+ postDelayedRunnable(mHideMainBars, mDelayedAnimationIntervalMs);
}
}
};
@@ -1389,7 +1401,7 @@
mSettingsIconIdsList = new ArrayList<Integer>();
mSettingsIconIdsList.add(R.drawable.ic_audiotrack);
- mSettingsIconIdsList.add(R.drawable.ic_play_circle_filled);
+ mSettingsIconIdsList.add(R.drawable.ic_speed);
mAudioTrackList = new ArrayList<String>();
mAudioTrackList.add(
@@ -1476,7 +1488,7 @@
void resetHideCallbacks() {
removeCallbacks(mHideMainBars);
removeCallbacks(mHideProgressBar);
- postDelayed(mHideMainBars, mShowControllerIntervalMs);
+ postDelayedRunnable(mHideMainBars, mDelayedAnimationIntervalMs);
}
void updateAllowedCommands(SessionCommandGroup commands) {
@@ -1638,6 +1650,12 @@
}
}
+ void postDelayedRunnable(Runnable runnable, long interval) {
+ if (interval != DISABLE_DELAYED_ANIMATION) {
+ postDelayed(runnable, interval);
+ }
+ }
+
private class SettingsAdapter extends BaseAdapter {
private List<Integer> mIconIds;
private List<String> mMainTexts;
@@ -1683,12 +1701,7 @@
@Override
public View getView(int position, View convertView, ViewGroup container) {
- View row;
- if (mSizeType == SIZE_TYPE_FULL) {
- row = inflateLayout(getContext(), R.layout.full_settings_list_item);
- } else {
- row = inflateLayout(getContext(), R.layout.embedded_settings_list_item);
- }
+ View row = inflateLayout(getContext(), R.layout.settings_list_item);
TextView mainTextView = (TextView) row.findViewById(R.id.main_text);
TextView subTextView = (TextView) row.findViewById(R.id.sub_text);
ImageView iconView = (ImageView) row.findViewById(R.id.icon);
@@ -1758,12 +1771,7 @@
@Override
public View getView(int position, View convertView, ViewGroup container) {
- View row;
- if (mSizeType == SIZE_TYPE_FULL) {
- row = inflateLayout(getContext(), R.layout.full_sub_settings_list_item);
- } else {
- row = inflateLayout(getContext(), R.layout.embedded_sub_settings_list_item);
- }
+ View row = inflateLayout(getContext(), R.layout.sub_settings_list_item);
TextView textView = (TextView) row.findViewById(R.id.text);
ImageView checkView = (ImageView) row.findViewById(R.id.check);
@@ -2049,7 +2057,7 @@
removeCallbacks(mUpdateProgress);
removeCallbacks(mHideMainBars);
post(mUpdateProgress);
- postDelayed(mHideMainBars, mShowControllerIntervalMs);
+ postDelayedRunnable(mHideMainBars, mDelayedAnimationIntervalMs);
}
}
diff --git a/media2-widget/src/main/java/androidx/media2/widget/MusicView.java b/media2-widget/src/main/java/androidx/media2/widget/MusicView.java
index 73a4350..1b73802 100644
--- a/media2-widget/src/main/java/androidx/media2/widget/MusicView.java
+++ b/media2-widget/src/main/java/androidx/media2/widget/MusicView.java
@@ -50,8 +50,8 @@
if (width > height) {
mType = MusicViewType.WITH_TITLE_LANDSCAPE;
- mWithTitleLandscape.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED));
+ mWithTitleLandscape.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.UNSPECIFIED),
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
if (hasTooSmallMeasuredState(mWithTitleLandscape)
|| mWithTitleLandscape.getMeasuredWidth() > width) {
mType = MusicViewType.WITHOUT_TITLE;
diff --git a/media2-widget/src/main/java/androidx/media2/widget/RoutePlayer.java b/media2-widget/src/main/java/androidx/media2/widget/RoutePlayer.java
index d977c8b..011da20 100644
--- a/media2-widget/src/main/java/androidx/media2/widget/RoutePlayer.java
+++ b/media2-widget/src/main/java/androidx/media2/widget/RoutePlayer.java
@@ -16,7 +16,7 @@
package androidx.media2.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.SessionPlayer.PlayerResult.RESULT_ERROR_BAD_VALUE;
import static androidx.media2.SessionPlayer.PlayerResult.RESULT_ERROR_INVALID_STATE;
import static androidx.media2.SessionPlayer.PlayerResult.RESULT_ERROR_UNKNOWN_ERROR;
@@ -56,7 +56,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class RoutePlayer extends RemoteSessionPlayer {
private static final String TAG = "RoutePlayer";
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
diff --git a/media2-widget/src/main/java/androidx/media2/widget/VideoView.java b/media2-widget/src/main/java/androidx/media2/widget/VideoView.java
index 0171194..87bf21c 100644
--- a/media2-widget/src/main/java/androidx/media2/widget/VideoView.java
+++ b/media2-widget/src/main/java/androidx/media2/widget/VideoView.java
@@ -16,7 +16,7 @@
package androidx.media2.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.SessionResult.RESULT_ERROR_INVALID_STATE;
import static androidx.media2.SessionResult.RESULT_SUCCESS;
@@ -128,7 +128,7 @@
*/
public class VideoView extends SelectiveLayout {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({
VIEW_TYPE_TEXTUREVIEW,
VIEW_TYPE_SURFACEVIEW
@@ -178,12 +178,12 @@
MediaItem mMediaItem;
MediaControlView mMediaControlView;
MediaSession mMediaSession;
- private String mTitle;
+ String mTitle;
Executor mCallbackExecutor;
MusicView mMusicView;
- private Drawable mMusicAlbumDrawable;
- private String mMusicArtistText;
+ Drawable mMusicAlbumDrawable;
+ String mMusicArtistText;
int mDominantColor;
@@ -405,7 +405,7 @@
*/
public void setMediaControlView(@NonNull MediaControlView mediaControlView, long intervalMs) {
mMediaControlView = mediaControlView;
- mMediaControlView.setShowControllerInterval(intervalMs);
+ mMediaControlView.setDelayedAnimationInterval(intervalMs);
if (isAttachedToWindow()) {
attachMediaControlView();
@@ -791,129 +791,6 @@
return data;
}
- @SuppressLint("RestrictedApi")
- MediaMetadata extractMetadata(MediaItem mediaItem, boolean isMusic) {
- MediaMetadataRetriever retriever = null;
- String path = "";
- try {
- if (mediaItem == null) {
- return null;
- } else if (mediaItem instanceof UriMediaItem) {
- Uri uri = ((UriMediaItem) mediaItem).getUri();
-
- // Save file name as title since the file may not have a title Metadata.
- if (UriUtil.isFromNetwork(uri)) {
- path = uri.getPath();
- } else if ("file".equals(uri.getScheme())) {
- path = uri.getLastPathSegment();
- } else {
- // TODO: needs default title. b/120515913
- }
- retriever = new MediaMetadataRetriever();
- retriever.setDataSource(getContext(), uri);
- } else if (mediaItem instanceof FileMediaItem) {
- retriever = new MediaMetadataRetriever();
- retriever.setDataSource(
- ((FileMediaItem) mediaItem).getParcelFileDescriptor().getFileDescriptor(),
- ((FileMediaItem) mediaItem).getFileDescriptorOffset(),
- ((FileMediaItem) mediaItem).getFileDescriptorLength());
- }
- } catch (IllegalArgumentException e) {
- Log.v(TAG, "Cannot retrieve metadata for this media file.");
- retriever = null;
- }
-
- MediaMetadata metadata = mediaItem.getMetadata();
-
- // Do not extract metadata of a media item which is not the current item.
- if (mediaItem != mMediaItem) {
- if (retriever != null) {
- retriever.release();
- }
- return null;
- }
- if (!isMusic) {
- mTitle = extractString(metadata,
- MediaMetadata.METADATA_KEY_TITLE, retriever,
- MediaMetadataRetriever.METADATA_KEY_TITLE, path);
- } else {
- Resources resources = getResources();
- mTitle = extractString(metadata,
- MediaMetadata.METADATA_KEY_TITLE, retriever,
- MediaMetadataRetriever.METADATA_KEY_TITLE,
- resources.getString(R.string.mcv2_music_title_unknown_text));
- mMusicArtistText = extractString(metadata,
- MediaMetadata.METADATA_KEY_ARTIST,
- retriever,
- MediaMetadataRetriever.METADATA_KEY_ARTIST,
- resources.getString(R.string.mcv2_music_artist_unknown_text));
- mMusicAlbumDrawable = extractAlbumArt(metadata, retriever,
- resources.getDrawable(R.drawable.ic_default_album_image));
- }
-
- if (retriever != null) {
- retriever.release();
- }
-
- // Set duration and title values as MediaMetadata for MediaControlView
- MediaMetadata.Builder builder = new MediaMetadata.Builder();
-
- if (isMusic) {
- builder.putString(MediaMetadata.METADATA_KEY_ARTIST, mMusicArtistText);
- }
- builder.putString(MediaMetadata.METADATA_KEY_TITLE, mTitle);
- builder.putLong(
- MediaMetadata.METADATA_KEY_DURATION, mMediaSession.getPlayer().getDuration());
- builder.putString(
- MediaMetadata.METADATA_KEY_MEDIA_ID, mediaItem.getMediaId());
- builder.putLong(MediaMetadata.METADATA_KEY_PLAYABLE, 1);
- return builder.build();
- }
-
- // TODO: move this method inside callback to make sure it runs inside the callback thread.
- private String extractString(MediaMetadata metadata, String stringKey,
- MediaMetadataRetriever retriever, int intKey, String defaultValue) {
- String value = null;
-
- if (metadata != null) {
- value = metadata.getString(stringKey);
- if (value != null && !value.isEmpty()) {
- return value;
- }
- }
- if (retriever != null) {
- value = retriever.extractMetadata(intKey);
- }
- return value == null ? defaultValue : value;
- }
-
- // TODO: move this method inside callback to make sure it runs inside the callback thread.
- private Drawable extractAlbumArt(MediaMetadata metadata, MediaMetadataRetriever retriever,
- Drawable defaultDrawable) {
- Bitmap bitmap = null;
-
- if (metadata != null && metadata.containsKey(MediaMetadata.METADATA_KEY_ALBUM_ART)) {
- bitmap = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
- } else if (retriever != null) {
- byte[] album = retriever.getEmbeddedPicture();
- if (album != null) {
- bitmap = BitmapFactory.decodeByteArray(album, 0, album.length);
- }
- }
- if (bitmap != null) {
- Palette.Builder builder = Palette.from(bitmap);
- builder.generate(new Palette.PaletteAsyncListener() {
- @Override
- public void onGenerated(Palette palette) {
- mDominantColor = palette.getDominantColor(0);
- mMusicView.setBackgroundColor(mDominantColor);
- }
- });
- return new BitmapDrawable(getResources(), bitmap);
- }
- return defaultDrawable;
- }
-
boolean isCurrentItemMusic() {
return mVideoTrackIndices != null && mVideoTrackIndices.size() == 0
&& mAudioTrackIndices != null && mAudioTrackIndices.size() > 0;
@@ -1080,7 +957,8 @@
// extractMetadata() contains file IO indirectly,
// via MediaMetadataRetriever.
boolean isMusic = isCurrentItemMusic();
- MetadataExtractTask task = new MetadataExtractTask(mMediaItem, isMusic);
+ MetadataExtractTask task = new MetadataExtractTask(mMediaItem, isMusic,
+ getContext());
task.execute();
}
@@ -1212,10 +1090,12 @@
private class MetadataExtractTask extends AsyncTask<Void, Void, MediaMetadata> {
private MediaItem mItem;
private boolean mIsMusic;
+ private Context mContext;
- MetadataExtractTask(MediaItem mediaItem, boolean isMusic) {
+ MetadataExtractTask(MediaItem mediaItem, boolean isMusic, Context context) {
mItem = mediaItem;
mIsMusic = isMusic;
+ mContext = context;
}
@Override
@@ -1238,6 +1118,128 @@
mMusicView.setVisibility(View.GONE);
}
}
+
+ @SuppressLint("RestrictedApi")
+ MediaMetadata extractMetadata(MediaItem mediaItem, boolean isMusic) {
+ MediaMetadataRetriever retriever = null;
+ String path = "";
+ try {
+ if (mediaItem == null) {
+ return null;
+ } else if (mediaItem instanceof UriMediaItem) {
+ Uri uri = ((UriMediaItem) mediaItem).getUri();
+
+ // Save file name as title since the file may not have a title Metadata.
+ if (UriUtil.isFromNetwork(uri)) {
+ path = uri.getPath();
+ } else if ("file".equals(uri.getScheme())) {
+ path = uri.getLastPathSegment();
+ } else {
+ // TODO: needs default title. b/120515913
+ }
+ retriever = new MediaMetadataRetriever();
+ retriever.setDataSource(mContext, uri);
+ } else if (mediaItem instanceof FileMediaItem) {
+ retriever = new MediaMetadataRetriever();
+ retriever.setDataSource(
+ ((FileMediaItem) mediaItem).getParcelFileDescriptor()
+ .getFileDescriptor(),
+ ((FileMediaItem) mediaItem).getFileDescriptorOffset(),
+ ((FileMediaItem) mediaItem).getFileDescriptorLength());
+ }
+ } catch (IllegalArgumentException e) {
+ Log.v(TAG, "Cannot retrieve metadata for this media file.");
+ retriever = null;
+ }
+
+ MediaMetadata metadata = mediaItem.getMetadata();
+
+ // Do not extract metadata of a media item which is not the current item.
+ if (mediaItem != mMediaItem) {
+ if (retriever != null) {
+ retriever.release();
+ }
+ return null;
+ }
+ if (!isMusic) {
+ mTitle = extractString(metadata,
+ MediaMetadata.METADATA_KEY_TITLE, retriever,
+ MediaMetadataRetriever.METADATA_KEY_TITLE, path);
+ } else {
+ Resources resources = getResources();
+ mTitle = extractString(metadata,
+ MediaMetadata.METADATA_KEY_TITLE, retriever,
+ MediaMetadataRetriever.METADATA_KEY_TITLE,
+ resources.getString(R.string.mcv2_music_title_unknown_text));
+ mMusicArtistText = extractString(metadata,
+ MediaMetadata.METADATA_KEY_ARTIST,
+ retriever,
+ MediaMetadataRetriever.METADATA_KEY_ARTIST,
+ resources.getString(R.string.mcv2_music_artist_unknown_text));
+ mMusicAlbumDrawable = extractAlbumArt(metadata, retriever,
+ resources.getDrawable(R.drawable.ic_default_album_image));
+ }
+
+ if (retriever != null) {
+ retriever.release();
+ }
+
+ // Set duration and title values as MediaMetadata for MediaControlView
+ MediaMetadata.Builder builder = new MediaMetadata.Builder();
+
+ if (isMusic) {
+ builder.putString(MediaMetadata.METADATA_KEY_ARTIST, mMusicArtistText);
+ }
+ builder.putString(MediaMetadata.METADATA_KEY_TITLE, mTitle);
+ builder.putLong(
+ MediaMetadata.METADATA_KEY_DURATION, mMediaSession.getPlayer().getDuration());
+ builder.putString(
+ MediaMetadata.METADATA_KEY_MEDIA_ID, mediaItem.getMediaId());
+ builder.putLong(MediaMetadata.METADATA_KEY_PLAYABLE, 1);
+ return builder.build();
+ }
+
+ private String extractString(MediaMetadata metadata, String stringKey,
+ MediaMetadataRetriever retriever, int intKey, String defaultValue) {
+ String value = null;
+
+ if (metadata != null) {
+ value = metadata.getString(stringKey);
+ if (value != null && !value.isEmpty()) {
+ return value;
+ }
+ }
+ if (retriever != null) {
+ value = retriever.extractMetadata(intKey);
+ }
+ return value == null ? defaultValue : value;
+ }
+
+ private Drawable extractAlbumArt(MediaMetadata metadata, MediaMetadataRetriever retriever,
+ Drawable defaultDrawable) {
+ Bitmap bitmap = null;
+
+ if (metadata != null && metadata.containsKey(MediaMetadata.METADATA_KEY_ALBUM_ART)) {
+ bitmap = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
+ } else if (retriever != null) {
+ byte[] album = retriever.getEmbeddedPicture();
+ if (album != null) {
+ bitmap = BitmapFactory.decodeByteArray(album, 0, album.length);
+ }
+ }
+ if (bitmap != null) {
+ Palette.Builder builder = Palette.from(bitmap);
+ builder.generate(new Palette.PaletteAsyncListener() {
+ @Override
+ public void onGenerated(Palette palette) {
+ mDominantColor = palette.getDominantColor(0);
+ mMusicView.setBackgroundColor(mDominantColor);
+ }
+ });
+ return new BitmapDrawable(getResources(), bitmap);
+ }
+ return defaultDrawable;
+ }
}
/**
diff --git a/media2-widget/src/main/res/drawable/ic_audiotrack.xml b/media2-widget/src/main/res/drawable/ic_audiotrack.xml
index 27c12b5..4a5cd33 100644
--- a/media2-widget/src/main/res/drawable/ic_audiotrack.xml
+++ b/media2-widget/src/main/res/drawable/ic_audiotrack.xml
@@ -1,9 +1,31 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M12,3v9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12 6,14.01 6,16.5S8.01,21 10.5,21c2.31,0 4.2,-1.75 4.45,-4H15V6h4V3h-7z"/>
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M18.2,1L9.8,1C8.81,1 8,1.81 8,2.8v14.4c0,0.99 0.81,1.79 1.8,1.79l8.4,0.01c0.99,0 1.8,-0.81 1.8,-1.8L20,2.8c0,-0.99 -0.81,-1.8 -1.8,-1.8zM14,3c1.1,0 2,0.89 2,2s-0.9,2 -2,2 -2,-0.89 -2,-2 0.9,-2 2,-2zM14,16.5c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M14,12.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M6,5H4v16c0,1.1 0.89,2 2,2h10v-2H6V5z"
+ android:fillColor="#FFFFFF"/>
</vector>
diff --git a/media2-widget/src/main/res/drawable/ic_speed.xml b/media2-widget/src/main/res/drawable/ic_speed.xml
new file mode 100644
index 0000000..7c066bf
--- /dev/null
+++ b/media2-widget/src/main/res/drawable/ic_speed.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM11,4.07L11,2.05c-2.01,0.2 -3.84,1 -5.32,2.21L7.1,5.69c1.11,-0.86 2.44,-1.44 3.9,-1.62zM5.69,7.1L4.26,5.68C3.05,7.16 2.25,8.99 2.05,11h2.02c0.18,-1.46 0.76,-2.79 1.62,-3.9zM4.07,13L2.05,13c0.2,2.01 1,3.84 2.21,5.32l1.43,-1.43c-0.86,-1.1 -1.44,-2.43 -1.62,-3.89zM5.68,19.74C7.16,20.95 9,21.75 11,21.95v-2.02c-1.46,-0.18 -2.79,-0.76 -3.9,-1.62l-1.42,1.43zM22,12c0,5.16 -3.92,9.42 -8.95,9.95v-2.02C16.97,19.41 20,16.05 20,12s-3.03,-7.41 -6.95,-7.93L13.05,2.05C18.08,2.58 22,6.84 22,12z"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/media2-widget/src/main/res/layout/embedded_settings_list_item.xml b/media2-widget/src/main/res/layout/embedded_settings_list_item.xml
deleted file mode 100644
index d7bc0b4..0000000
--- a/media2-widget/src/main/res/layout/embedded_settings_list_item.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_settings_height"
- android:gravity="center|start"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/icon"
- android:layout_width="@dimen/mcv2_settings_icon_size"
- android:layout_height="@dimen/mcv2_settings_icon_size"
- android:layout_margin="8dp" />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center|start">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/main_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_settings_main_text_size"/>
-
- <TextView
- android:id="@+id/sub_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingStart="2dp"
- android:textColor="@color/white_opacity_70"
- android:textSize="@dimen/mcv2_settings_sub_text_size"/>
- </LinearLayout>
- </LinearLayout>
-</LinearLayout>
diff --git a/media2-widget/src/main/res/layout/embedded_sub_settings_list_item.xml b/media2-widget/src/main/res/layout/embedded_sub_settings_list_item.xml
deleted file mode 100644
index e44342e..0000000
--- a/media2-widget/src/main/res/layout/embedded_sub_settings_list_item.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_settings_height"
- android:gravity="center|start"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/check"
- android:layout_width="@dimen/mcv2_settings_icon_size"
- android:layout_height="@dimen/mcv2_settings_icon_size"
- android:layout_margin="8dp"
- android:src="@drawable/ic_check"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_settings_height"
- android:gravity="center|start"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_settings_text_height"
- android:paddingStart="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_settings_main_text_size"/>
- </RelativeLayout>
-</LinearLayout>
diff --git a/media2-widget/src/main/res/layout/full_settings_list_item.xml b/media2-widget/src/main/res/layout/settings_list_item.xml
similarity index 100%
rename from media2-widget/src/main/res/layout/full_settings_list_item.xml
rename to media2-widget/src/main/res/layout/settings_list_item.xml
diff --git a/media2-widget/src/main/res/layout/full_sub_settings_list_item.xml b/media2-widget/src/main/res/layout/sub_settings_list_item.xml
similarity index 100%
rename from media2-widget/src/main/res/layout/full_sub_settings_list_item.xml
rename to media2-widget/src/main/res/layout/sub_settings_list_item.xml
diff --git a/media2/src/androidTest/java/androidx/media2/MediaSessionManager_MediaSessionTest.java b/media2/src/androidTest/java/androidx/media2/MediaSessionManager_MediaSessionTest.java
index b986c69..e389492 100644
--- a/media2/src/androidTest/java/androidx/media2/MediaSessionManager_MediaSessionTest.java
+++ b/media2/src/androidTest/java/androidx/media2/MediaSessionManager_MediaSessionTest.java
@@ -36,7 +36,6 @@
*/
@RunWith(AndroidJUnit4.class)
@SmallTest
-@Ignore
public class MediaSessionManager_MediaSessionTest extends MediaSessionTestBase {
private static final String TAG = "MediaSessionManager_MediaSessionTest";
@@ -101,6 +100,7 @@
* @throws InterruptedException
*/
@Test
+ @Ignore
public void testGetSessionTokens_sessionRejected() throws InterruptedException {
prepareLooper();
mSession.close();
@@ -129,6 +129,7 @@
}
@Test
+ @Ignore
public void testGetMediaSessionTokens_sessionClosed() throws InterruptedException {
prepareLooper();
mSession.close();
@@ -144,6 +145,7 @@
}
@Test
+ @Ignore
public void testGetMediaSessionServiceToken() throws InterruptedException {
prepareLooper();
boolean foundTestSessionService = false;
@@ -168,6 +170,7 @@
}
@Test
+ @Ignore
public void testGetAllSessionTokens() throws InterruptedException {
prepareLooper();
boolean foundTestSession = false;
@@ -204,6 +207,7 @@
}
@Test
+ @Ignore
public void testAddOnSessionTokensChangedListener() throws InterruptedException {
// prepareLooper();
// TokensChangedListener listener = new TokensChangedListener();
@@ -259,6 +263,7 @@
}
@Test
+ @Ignore
public void testRemoveOnSessionTokensChangedListener() throws InterruptedException {
// prepareLooper();
// TokensChangedListener listener = new TokensChangedListener();
diff --git a/media2/src/main/java/androidx/media2/FileMediaItem.java b/media2/src/main/java/androidx/media2/FileMediaItem.java
index 4ea0f95..9793cef 100644
--- a/media2/src/main/java/androidx/media2/FileMediaItem.java
+++ b/media2/src/main/java/androidx/media2/FileMediaItem.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.ParcelFileDescriptor;
import android.util.Log;
@@ -109,7 +109,7 @@
* Increases reference count for underlying ParcelFileDescriptor.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void increaseRefCount() {
synchronized (mRefCount) {
if (mClosed) {
@@ -125,7 +125,7 @@
* be closed when the count becomes zero.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void decreaseRefCount() {
synchronized (mRefCount) {
if (mClosed) {
diff --git a/media2/src/main/java/androidx/media2/LibraryResult.java b/media2/src/main/java/androidx/media2/LibraryResult.java
index 178c990..b03891f 100644
--- a/media2/src/main/java/androidx/media2/LibraryResult.java
+++ b/media2/src/main/java/androidx/media2/LibraryResult.java
@@ -17,7 +17,7 @@
package androidx.media2;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.SystemClock;
@@ -65,7 +65,7 @@
RESULT_ERROR_SESSION_SKIP_LIMIT_REACHED,
RESULT_ERROR_SESSION_SETUP_REQUIRED})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface ResultCode {}
@ParcelField(1)
diff --git a/media2/src/main/java/androidx/media2/MediaController.java b/media2/src/main/java/androidx/media2/MediaController.java
index 193014d..839bd4f 100644
--- a/media2/src/main/java/androidx/media2/MediaController.java
+++ b/media2/src/main/java/androidx/media2/MediaController.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.SessionPlayer.BUFFERING_STATE_UNKNOWN;
import static androidx.media2.SessionPlayer.PLAYER_STATE_IDLE;
import static androidx.media2.SessionPlayer.REPEAT_MODE_NONE;
@@ -100,7 +100,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({AudioManager.ADJUST_LOWER, AudioManager.ADJUST_RAISE, AudioManager.ADJUST_SAME,
AudioManager.ADJUST_MUTE, AudioManager.ADJUST_UNMUTE, AudioManager.ADJUST_TOGGLE_MUTE})
@Retention(RetentionPolicy.SOURCE)
@@ -109,7 +109,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(value = {AudioManager.FLAG_SHOW_UI, AudioManager.FLAG_ALLOW_RINGER_MODES,
AudioManager.FLAG_PLAY_SOUND, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE,
AudioManager.FLAG_VIBRATE}, flag = true)
@@ -413,7 +413,7 @@
* to be played.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ListenableFuture<SessionResult> playFromMediaId(@NonNull String mediaId,
@Nullable Bundle extras) {
if (TextUtils.isEmpty(mediaId)) {
@@ -432,7 +432,7 @@
* @param extras Optional extras that can include extra information about the query.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ListenableFuture<SessionResult> playFromSearch(@NonNull String query,
@Nullable Bundle extras) {
if (TextUtils.isEmpty(query)) {
@@ -452,7 +452,7 @@
* to be played.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ListenableFuture<SessionResult> playFromUri(@NonNull Uri uri,
@Nullable Bundle extras) {
if (uri == null) {
@@ -478,7 +478,7 @@
* to be prepared.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ListenableFuture<SessionResult> prepareFromMediaId(@NonNull String mediaId,
@Nullable Bundle extras) {
if (TextUtils.isEmpty(mediaId)) {
@@ -503,7 +503,7 @@
* @param extras Optional extras that can include extra information about the query.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ListenableFuture<SessionResult> prepareFromSearch(@NonNull String query,
@Nullable Bundle extras) {
if (TextUtils.isEmpty(query)) {
@@ -529,7 +529,7 @@
* to be prepared.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ListenableFuture<SessionResult> prepareFromUri(@NonNull Uri uri,
@Nullable Bundle extras) {
if (uri == null) {
@@ -1069,7 +1069,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setTimeDiff(Long timeDiff) {
mTimeDiff = timeDiff;
}
diff --git a/media2/src/main/java/androidx/media2/MediaControllerImplBase.java b/media2/src/main/java/androidx/media2/MediaControllerImplBase.java
index d92ef58..0b90962 100644
--- a/media2/src/main/java/androidx/media2/MediaControllerImplBase.java
+++ b/media2/src/main/java/androidx/media2/MediaControllerImplBase.java
@@ -183,14 +183,17 @@
}
};
- IMediaSession iSession = IMediaSession.Stub.asInterface((IBinder) mToken.getBinder());
+ boolean connectionRequested;
if (mToken.getType() == SessionToken.TYPE_SESSION) {
// Session
mServiceConnection = null;
- connectToSession();
+ connectionRequested = requestConnectToSession();
} else {
mServiceConnection = new SessionServiceConnection();
- connectToService();
+ connectionRequested = requestConnectToService();
+ }
+ if (!connectionRequested) {
+ mInstance.close();
}
}
@@ -790,7 +793,7 @@
return mInstance;
}
- private void connectToService() {
+ private boolean requestConnectToService() {
// Service. Needs to get fresh binder whenever connection is needed.
final Intent intent = new Intent(MediaSessionService.SERVICE_INTERFACE);
intent.setClassName(mToken.getPackageName(), mToken.getServiceName());
@@ -814,13 +817,16 @@
intent, mServiceConnection, Context.BIND_AUTO_CREATE);
if (!result) {
Log.w(TAG, "bind to " + mToken + " failed");
- } else if (DEBUG) {
- Log.d(TAG, "bind to " + mToken + " succeeded");
+ return false;
}
}
+ if (DEBUG) {
+ Log.d(TAG, "bind to " + mToken + " succeeded");
+ }
+ return true;
}
- private void connectToSession() {
+ private boolean requestConnectToSession() {
IMediaSession iSession = IMediaSession.Stub.asInterface((IBinder) mToken.getBinder());
int seq = mSequencedFutureManager.obtainNextSequenceNumber();
ConnectionRequest request =
@@ -828,9 +834,10 @@
try {
iSession.connect(mControllerStub, seq, MediaUtils.toParcelable(request));
} catch (RemoteException e) {
- Log.w(TAG, "Failed to call connection request. Framework will retry"
- + " automatically");
+ Log.w(TAG, "Failed to call connection request.", e);
+ return false;
}
+ return true;
}
// Returns session interface if the controller can send the command.
@@ -1202,39 +1209,46 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- // Note that it's always main-thread.
- if (DEBUG) {
- Log.d(TAG, "onServiceConnected " + name + " " + this);
- }
- // Sanity check
- if (!mToken.getPackageName().equals(name.getPackageName())) {
- Log.wtf(TAG, "Expected connection to " + mToken.getPackageName() + " but is"
- + " connected to " + name);
- return;
- }
- IMediaSessionService iService = IMediaSessionService.Stub.asInterface(service);
- if (iService == null) {
- Log.wtf(TAG, "Service interface is missing.");
- return;
- }
- ConnectionRequest request =
- new ConnectionRequest(getContext().getPackageName(), Process.myPid());
+ boolean connectionRequested = false;
try {
-
+ // Note that it's always main-thread.
+ if (DEBUG) {
+ Log.d(TAG, "onServiceConnected " + name + " " + this);
+ }
+ // Sanity check
+ if (!mToken.getPackageName().equals(name.getPackageName())) {
+ Log.wtf(TAG, "Expected connection to " + mToken.getPackageName() + " but is"
+ + " connected to " + name);
+ return;
+ }
+ IMediaSessionService iService = IMediaSessionService.Stub.asInterface(service);
+ if (iService == null) {
+ Log.wtf(TAG, "Service interface is missing.");
+ return;
+ }
+ ConnectionRequest request =
+ new ConnectionRequest(getContext().getPackageName(), Process.myPid());
iService.connect(mControllerStub, MediaUtils.toParcelable(request));
+ connectionRequested = true;
} catch (RemoteException e) {
Log.w(TAG, "Service " + name + " has died prematurely");
- mInstance.close();
+ } finally {
+ if (!connectionRequested) {
+ mInstance.close();
+ }
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// Temporal lose of the binding because of the service crash. System will automatically
- // rebind, so just no-op.
+ // rebind, but we'd better to close() here. Otherwise ControllerCallback#onConnected()
+ // would be called multiple times, and the controller would be connected to the
+ // different session everytime.
if (DEBUG) {
Log.w(TAG, "Session service " + name + " is disconnected.");
}
+ mInstance.close();
}
@Override
@@ -1242,7 +1256,7 @@
// Permanent lose of the binding because of the service package update or removed.
// This SessionServiceRecord will be removed accordingly, but forget session binder here
// for sure.
- close();
+ mInstance.close();
}
}
}
diff --git a/media2/src/main/java/androidx/media2/MediaItem.java b/media2/src/main/java/androidx/media2/MediaItem.java
index bde8156f..4bb748f 100644
--- a/media2/src/main/java/androidx/media2/MediaItem.java
+++ b/media2/src/main/java/androidx/media2/MediaItem.java
@@ -18,6 +18,7 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.text.TextUtils;
@@ -209,7 +210,7 @@
* @hide
*/
// TODO: Remove
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP)
public @Nullable String getMediaId() {
synchronized (mLock) {
return mMetadata != null
@@ -245,7 +246,7 @@
* @param <T> builder class
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class BuilderBase<T extends BuilderBase> {
@SuppressWarnings("WeakerAccess") /* synthetic access */
MediaMetadata mMetadata;
diff --git a/media2/src/main/java/androidx/media2/MediaMetadata.java b/media2/src/main/java/androidx/media2/MediaMetadata.java
index 2c33058..0244fde 100644
--- a/media2/src/main/java/androidx/media2/MediaMetadata.java
+++ b/media2/src/main/java/androidx/media2/MediaMetadata.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
@@ -466,7 +466,7 @@
* @see Builder#putFloat(String, float)
* @see #getFloat(String)
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String METADATA_KEY_RADIO_FREQUENCY =
"androidx.media2.metadata.RADIO_FREQUENCY";
@@ -480,7 +480,7 @@
* @see #getText(String)
* @see #getString(String)
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String METADATA_KEY_RADIO_PROGRAM_NAME =
"androidx.media2.metadata.RADIO_PROGRAM_NAME";
@@ -640,7 +640,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_TITLE, METADATA_KEY_ARTIST, METADATA_KEY_ALBUM, METADATA_KEY_AUTHOR,
METADATA_KEY_WRITER, METADATA_KEY_COMPOSER, METADATA_KEY_COMPILATION,
METADATA_KEY_DATE, METADATA_KEY_GENRE, METADATA_KEY_ALBUM_ARTIST, METADATA_KEY_ART_URI,
@@ -653,7 +653,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_DURATION, METADATA_KEY_YEAR, METADATA_KEY_TRACK_NUMBER,
METADATA_KEY_NUM_TRACKS, METADATA_KEY_DISC_NUMBER, METADATA_KEY_BROWSABLE,
METADATA_KEY_PLAYABLE, METADATA_KEY_ADVERTISEMENT, METADATA_KEY_DOWNLOAD_STATUS})
@@ -663,7 +663,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_ART, METADATA_KEY_ALBUM_ART, METADATA_KEY_DISPLAY_ICON})
@Retention(RetentionPolicy.SOURCE)
public @interface BitmapKey {}
@@ -671,7 +671,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_USER_RATING, METADATA_KEY_RATING})
@Retention(RetentionPolicy.SOURCE)
public @interface RatingKey {}
@@ -679,7 +679,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_RADIO_FREQUENCY})
@Retention(RetentionPolicy.SOURCE)
public @interface FloatKey {}
@@ -687,7 +687,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({METADATA_KEY_EXTRAS})
@Retention(RetentionPolicy.SOURCE)
public @interface BundleKey {}
@@ -957,7 +957,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @Nullable Object getObject(@NonNull String key) {
if (key == null) {
throw new IllegalArgumentException("key shouldn't be null");
@@ -969,7 +969,7 @@
* @hide
*/
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void onPreParceling(boolean isStream) {
List<ParcelImpl> parcelImplList = new ArrayList<>();
List<String> keysForBitmap = new ArrayList<>();
@@ -993,7 +993,7 @@
* @hide
*/
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void onPostParceling() {
List<ParcelImpl> parcelImplList = mBitmapListSlice.getList();
for (ParcelImpl parcelImpl : parcelImplList) {
diff --git a/media2/src/main/java/androidx/media2/MediaPlayer.java b/media2/src/main/java/androidx/media2/MediaPlayer.java
index c93e6d3..861be42 100644
--- a/media2/src/main/java/androidx/media2/MediaPlayer.java
+++ b/media2/src/main/java/androidx/media2/MediaPlayer.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.SessionPlayer.PlayerResult.RESULT_ERROR_BAD_VALUE;
import static androidx.media2.SessionPlayer.PlayerResult.RESULT_ERROR_INVALID_STATE;
import static androidx.media2.SessionPlayer.PlayerResult.RESULT_ERROR_IO_ERROR;
@@ -164,7 +164,7 @@
* @see PlayerCallback#onError
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int PLAYER_ERROR_SYSTEM = -2147483648;
/**
@@ -179,7 +179,7 @@
PLAYER_ERROR_SYSTEM
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface MediaError {}
/**
@@ -187,7 +187,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_UNKNOWN = 1;
/**
@@ -195,7 +195,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_MEDIA_ITEM_START = 2;
/**
@@ -209,7 +209,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_MEDIA_ITEM_END = 5;
/**
@@ -218,7 +218,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_MEDIA_ITEM_LIST_END = 6;
/**
@@ -227,7 +227,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_MEDIA_ITEM_REPEAT = 7;
/**
@@ -250,7 +250,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_BUFFERING_START = 701;
/**
@@ -258,7 +258,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_BUFFERING_END = 702;
/**
@@ -268,7 +268,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
/**
@@ -303,7 +303,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_METADATA_UPDATE = 802;
/**
@@ -311,7 +311,7 @@
* JAVA framework to avoid triggering track scanning.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_EXTERNAL_METADATA_UPDATE = 803;
/**
@@ -332,7 +332,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
/**
@@ -340,7 +340,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;
/**
@@ -348,7 +348,7 @@
* @see PlayerCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;
/**
@@ -378,7 +378,7 @@
MEDIA_INFO_SUBTITLE_TIMED_OUT
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface MediaInfo {}
/**
@@ -422,7 +422,7 @@
SEEK_CLOSEST,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface SeekMode {}
private static final int CALL_COMPLETE_PLAYLIST_BASE = -1000;
@@ -1461,7 +1461,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public AudioFocusHandler getAudioFocusHandler() {
return mAudioFocusHandler;
@@ -1611,7 +1611,7 @@
* Additional vendor-specific fields may also be present in the return value.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(21)
@SuppressLint("RestrictedApi")
public PersistableBundle getMetrics() {
@@ -1977,7 +1977,7 @@
* @hide
*/
@Nullable
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi")
public DrmInfo getDrmInfo() {
MediaPlayer2.DrmInfo info = mPlayer.getDrmInfo();
@@ -2008,7 +2008,7 @@
* {@link DrmResult} will be delivered when the command completes.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
// This is an asynchronous call.
@NonNull
@SuppressLint("RestrictedApi")
@@ -2042,7 +2042,7 @@
* @hide
*/
@SuppressLint("RestrictedApi")
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void releaseDrm() throws NoDrmSchemeException {
try {
mPlayer.releaseDrm();
@@ -2089,7 +2089,7 @@
* @throws NoDrmSchemeException if there is no active DRM session
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
@SuppressLint("RestrictedApi")
public MediaDrm.KeyRequest getDrmKeyRequest(
@@ -2126,7 +2126,7 @@
* @hide
*/
@Nullable
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi")
public byte[] provideDrmKeyResponse(
@Nullable byte[] keySetId, @NonNull byte[] response)
@@ -2146,7 +2146,7 @@
* @hide
*/
@SuppressLint("RestrictedApi")
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void restoreDrmKeys(@NonNull byte[] keySetId) throws NoDrmSchemeException {
try {
mPlayer.restoreDrmKeys(keySetId);
@@ -2165,7 +2165,7 @@
* {@link MediaDrm#PROPERTY_DESCRIPTION}, {@link MediaDrm#PROPERTY_ALGORITHMS}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
@SuppressLint("RestrictedApi")
public String getDrmPropertyString(@NonNull String propertyName) throws NoDrmSchemeException {
@@ -2187,7 +2187,7 @@
* {@link MediaDrm#PROPERTY_DESCRIPTION}, {@link MediaDrm#PROPERTY_ALGORITHMS}
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi")
public void setDrmPropertyString(@NonNull String propertyName, @NonNull String value)
throws NoDrmSchemeException {
@@ -2208,7 +2208,7 @@
* @hide
*/
@SuppressLint("RestrictedApi")
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setOnDrmConfigHelper(@Nullable final OnDrmConfigHelper listener) {
mPlayer.setOnDrmConfigHelper(listener == null ? null :
new MediaPlayer2.OnDrmConfigHelper() {
@@ -2777,7 +2777,7 @@
* of crypto schemes supported by this device
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void onDrmInfo(@NonNull MediaPlayer mp,
@NonNull MediaItem item, @NonNull DrmInfo drmInfo) { }
}
@@ -2792,7 +2792,7 @@
public static final int MEDIA_TRACK_TYPE_VIDEO = 1;
public static final int MEDIA_TRACK_TYPE_AUDIO = 2;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3;
public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4;
public static final int MEDIA_TRACK_TYPE_METADATA = 5;
@@ -2870,7 +2870,7 @@
* Encapsulates the DRM properties of the source.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final class DrmInfo {
private final MediaPlayer2.DrmInfo mMp2DrmInfo;
@@ -2908,7 +2908,7 @@
* and {@link #setDrmPropertyString}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface OnDrmConfigHelper {
/**
* Called to give the app the opportunity to configure DRM before the session is created
@@ -2924,7 +2924,7 @@
* Extends MediaDrm.MediaDrmException
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class NoDrmSchemeException extends MediaDrmException {
public NoDrmSchemeException(@Nullable String detailMessage) {
super(detailMessage);
@@ -2935,7 +2935,7 @@
* Definitions for the metrics that are reported via the {@link #getMetrics} call.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final class MetricsConstants {
private MetricsConstants() {}
@@ -3032,7 +3032,7 @@
* Result class of the asynchronous DRM APIs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class DrmResult extends PlayerResult {
/**
* The device required DRM provisioning but couldn't reach the provisioning server.
@@ -3069,7 +3069,7 @@
RESULT_ERROR_RESOURCE_BUSY,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface DrmResultCode {}
/**
diff --git a/media2/src/main/java/androidx/media2/MediaPlayer2.java b/media2/src/main/java/androidx/media2/MediaPlayer2.java
index 8f79538..f8b05bb 100644
--- a/media2/src/main/java/androidx/media2/MediaPlayer2.java
+++ b/media2/src/main/java/androidx/media2/MediaPlayer2.java
@@ -17,7 +17,7 @@
package androidx.media2;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -253,7 +253,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaPlayer2() { }
/**
@@ -263,7 +263,7 @@
* @return {@code false} if the task could not be cancelled; {@code true} otherwise.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract boolean cancel(Object token);
/**
@@ -633,7 +633,7 @@
SEEK_CLOSEST,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface SeekMode {}
/**
@@ -781,7 +781,7 @@
public static final int MEDIA_TRACK_TYPE_AUDIO = 2;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3;
public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4;
@@ -1035,7 +1035,7 @@
PLAYER_STATE_PLAYING,
PLAYER_STATE_ERROR})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface MediaPlayer2State {}
/** Unspecified media player error.
@@ -1071,7 +1071,7 @@
* @see EventCallback#onError
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_ERROR_SYSTEM = -2147483648;
/**
@@ -1086,7 +1086,7 @@
MEDIA_ERROR_SYSTEM
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface MediaError {}
/** Unspecified media player info.
@@ -1154,7 +1154,7 @@
* @see EventCallback#onInfo
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
/**
@@ -1191,7 +1191,7 @@
* JAVA framework to avoid triggering track scanning.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_EXTERNAL_METADATA_UPDATE = 803;
/** Informs that audio is not playing. Note that playback of the video
@@ -1208,9 +1208,9 @@
/** Failed to handle timed text track properly.
* @see EventCallback#onInfo
- * {@hide}
+ * @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
/** Subtitle track was not supported by the media framework.
@@ -1251,7 +1251,7 @@
MEDIA_INFO_SUBTITLE_TIMED_OUT
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface MediaInfo {}
//--------------------------------------------------------------------------
@@ -1350,14 +1350,14 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int SEPARATE_CALL_COMPLETE_CALLBACK_START = 1000;
/** The player just completed a call {@code notifyWhenCommandLabelReached}.
* @see EventCallback#onCommandLabelReached
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED =
SEPARATE_CALL_COMPLETE_CALLBACK_START;
@@ -1365,7 +1365,7 @@
* @see EventCallback#onCommandLabelReached
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int CALL_COMPLETED_PREPARE_DRM =
SEPARATE_CALL_COMPLETE_CALLBACK_START + 1;
@@ -1395,7 +1395,7 @@
CALL_COMPLETED_PREPARE_DRM,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface CallCompleted {}
/** Status code represents that call is completed without an error.
@@ -1446,7 +1446,7 @@
CALL_STATUS_ERROR_IO,
CALL_STATUS_SKIPPED})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface CallStatus {}
// Modular DRM begin
@@ -1568,7 +1568,7 @@
PREPARE_DRM_STATUS_RESOURCE_BUSY,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface PrepareDrmStatusCode {}
/**
diff --git a/media2/src/main/java/androidx/media2/MediaPlayer2Impl.java b/media2/src/main/java/androidx/media2/MediaPlayer2Impl.java
index e240f57..dd94224 100644
--- a/media2/src/main/java/androidx/media2/MediaPlayer2Impl.java
+++ b/media2/src/main/java/androidx/media2/MediaPlayer2Impl.java
@@ -15,7 +15,7 @@
*/
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.media.AudioAttributes;
@@ -67,7 +67,7 @@
* @hide
*/
@RequiresApi(28)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi")
public final class MediaPlayer2Impl extends MediaPlayer2 {
diff --git a/media2/src/main/java/androidx/media2/MediaSession.java b/media2/src/main/java/androidx/media2/MediaSession.java
index 759768d..9455e3c 100644
--- a/media2/src/main/java/androidx/media2/MediaSession.java
+++ b/media2/src/main/java/androidx/media2/MediaSession.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.SessionResult.RESULT_ERROR_NOT_SUPPORTED;
import static androidx.media2.SessionResult.RESULT_SUCCESS;
@@ -189,7 +189,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isClosed() {
return mImpl.isClosed();
}
@@ -343,7 +343,7 @@
* @hide
* @return Bundle
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaSessionCompat getSessionCompat() {
return mImpl.getSessionCompat();
}
@@ -558,7 +558,7 @@
* @see SessionCommand#COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ResultCode
public int onPlayFromMediaId(@NonNull MediaSession session,
@NonNull ControllerInfo controller, @NonNull String mediaId,
@@ -577,7 +577,7 @@
* @see SessionCommand#COMMAND_CODE_SESSION_PLAY_FROM_SEARCH
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ResultCode
public int onPlayFromSearch(@NonNull MediaSession session,
@NonNull ControllerInfo controller, @NonNull String query,
@@ -596,7 +596,7 @@
* @see SessionCommand#COMMAND_CODE_SESSION_PLAY_FROM_URI
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ResultCode
public int onPlayFromUri(@NonNull MediaSession session,
@NonNull ControllerInfo controller, @NonNull Uri uri,
@@ -625,7 +625,7 @@
* @see SessionCommand#COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ResultCode
public int onPrepareFromMediaId(@NonNull MediaSession session,
@NonNull ControllerInfo controller, @NonNull String mediaId,
@@ -654,7 +654,7 @@
* @see SessionCommand#COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ResultCode
public int onPrepareFromSearch(@NonNull MediaSession session,
@NonNull ControllerInfo controller, @NonNull String query,
@@ -683,7 +683,7 @@
* @see SessionCommand#COMMAND_CODE_SESSION_PREPARE_FROM_URI
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@ResultCode
public int onPrepareFromUri(@NonNull MediaSession session,
@NonNull ControllerInfo controller, @NonNull Uri uri, @Nullable Bundle extras) {
@@ -831,7 +831,7 @@
* SessionCallback#onConnected().
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
ControllerInfo(@NonNull RemoteUserInfo remoteUserInfo, boolean trusted,
@Nullable ControllerCb cb) {
mRemoteUserInfo = remoteUserInfo;
@@ -842,7 +842,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @NonNull RemoteUserInfo getRemoteUserInfo() {
return mRemoteUserInfo;
}
@@ -871,7 +871,7 @@
* @return {@code true} if the controller is trusted.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isTrusted() {
return mIsTrusted;
}
@@ -1160,7 +1160,7 @@
* T, U, C extends androidx.media2.MediaSession.SessionCallback>, C></pre>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
abstract static class BuilderBase
<T extends MediaSession, U extends BuilderBase<T, U, C>, C extends SessionCallback> {
final Context mContext;
diff --git a/media2/src/main/java/androidx/media2/MediaTimestamp.java b/media2/src/main/java/androidx/media2/MediaTimestamp.java
index 653c323..c72cc62 100644
--- a/media2/src/main/java/androidx/media2/MediaTimestamp.java
+++ b/media2/src/main/java/androidx/media2/MediaTimestamp.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
@@ -77,7 +77,7 @@
private final float mClockRate;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaTimestamp(long mediaUs, long systemNs, float rate) {
mMediaTimeUs = mediaUs;
mNanoTime = systemNs;
@@ -86,7 +86,7 @@
/** @hide */
@RequiresApi(23)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
MediaTimestamp(android.media.MediaTimestamp timestamp) {
mMediaTimeUs = timestamp.getAnchorMediaTimeUs();
mNanoTime = timestamp.getAnchorSytemNanoTime();
@@ -94,7 +94,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
MediaTimestamp() {
mMediaTimeUs = 0;
mNanoTime = 0;
diff --git a/media2/src/main/java/androidx/media2/MediaUtils.java b/media2/src/main/java/androidx/media2/MediaUtils.java
index cc169cc..f9f8151 100644
--- a/media2/src/main/java/androidx/media2/MediaUtils.java
+++ b/media2/src/main/java/androidx/media2/MediaUtils.java
@@ -76,7 +76,7 @@
/**
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public class MediaUtils {
public static final String TAG = "MediaUtils";
diff --git a/media2/src/main/java/androidx/media2/ParcelImplListSlice.java b/media2/src/main/java/androidx/media2/ParcelImplListSlice.java
index 3a22249..0996678 100644
--- a/media2/src/main/java/androidx/media2/ParcelImplListSlice.java
+++ b/media2/src/main/java/androidx/media2/ParcelImplListSlice.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.Binder;
@@ -41,7 +41,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("BanParcelableUsage")
public class ParcelImplListSlice implements Parcelable {
private static final String TAG = "ParcelImplListSlice";
diff --git a/media2/src/main/java/androidx/media2/PlaybackParams.java b/media2/src/main/java/androidx/media2/PlaybackParams.java
index c9c441a..0749492 100644
--- a/media2/src/main/java/androidx/media2/PlaybackParams.java
+++ b/media2/src/main/java/androidx/media2/PlaybackParams.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.media.AudioTrack;
import android.os.Build;
@@ -63,7 +63,7 @@
*/
public final class PlaybackParams {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef(
value = {
AUDIO_FALLBACK_MODE_DEFAULT,
@@ -148,7 +148,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(23)
public android.media.PlaybackParams getPlaybackParams() {
if (Build.VERSION.SDK_INT >= 23) {
@@ -175,7 +175,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(23)
public Builder(android.media.PlaybackParams playbackParams) {
mPlaybackParams = playbackParams;
diff --git a/media2/src/main/java/androidx/media2/RemoteSessionPlayer.java b/media2/src/main/java/androidx/media2/RemoteSessionPlayer.java
index 0efddc7..e9070d6 100644
--- a/media2/src/main/java/androidx/media2/RemoteSessionPlayer.java
+++ b/media2/src/main/java/androidx/media2/RemoteSessionPlayer.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
@@ -24,6 +24,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.concurrent.Executor;
import java.util.concurrent.Future;
/**
@@ -32,15 +33,14 @@
* <p>
* If you use this to the {@link MediaSession}, session would dispatch incoming volume change event
* to the player instead of changing device stream volume.
- *
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class RemoteSessionPlayer extends SessionPlayer {
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({VOLUME_CONTROL_FIXED, VOLUME_CONTROL_RELATIVE, VOLUME_CONTROL_ABSOLUTE})
@Retention(RetentionPolicy.SOURCE)
public @interface VolumeControlType {}
@@ -69,13 +69,13 @@
* Adjust player volume with the direction. Override this API to customize volume change in
* remote device
* <p>
- * Default implement adjust volume by 1
- * <p>
* This would be ignored when volume control type is {@link #VOLUME_CONTROL_FIXED}.
*
* @param direction direction of the volume changes. Positive value for volume up, negative for
* volume down.
+ * @return result of adjusting the volume. Shouldn't be {@code null}.
*/
+ @NonNull
public abstract Future<PlayerResult> adjustVolume(int direction);
/**
@@ -88,8 +88,10 @@
* A value of {@code 0} indicates muting. See {@link #getMaxVolume()} for the volume range
* supported by this player.
*
- * @param volume a value between 0.0f and {@link #getMaxVolume()}.
+ * @param volume a value between {@code 0} and {@link #getMaxVolume()}.
+ * @return result of setting the volume. Shouldn't be {@code null}.
*/
+ @NonNull
public abstract Future<PlayerResult> setVolume(int volume);
/**
@@ -122,18 +124,23 @@
public abstract @VolumeControlType int getVolumeControlType();
/**
+ * A callback class to receive notifications for events on the remote session player. See
+ * {@link #registerPlayerCallback(Executor, PlayerCallback)} to register this callback.
+ * <p>
+ * This is registered by {@link MediaSession} to notify volume changes to the
+ * {@link MediaController}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class Callback extends SessionPlayer.PlayerCallback {
/**
* Called to indicate that the volume has changed.
*
- * @param player2 the player that has completed volume changes.
+ * @param player the player that has changed volume.
* @param volume the new volume
* @see #setVolume(int)
*/
- public void onVolumeChanged(@NonNull RemoteSessionPlayer player2, int volume) {
+ public void onVolumeChanged(@NonNull RemoteSessionPlayer player, int volume) {
}
}
}
diff --git a/media2/src/main/java/androidx/media2/SessionCommand.java b/media2/src/main/java/androidx/media2/SessionCommand.java
index 39abc08..fb891ac 100644
--- a/media2/src/main/java/androidx/media2/SessionCommand.java
+++ b/media2/src/main/java/androidx/media2/SessionCommand.java
@@ -17,7 +17,7 @@
package androidx.media2;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.net.Uri;
import android.os.Bundle;
@@ -69,7 +69,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({COMMAND_VERSION_1})
@Retention(RetentionPolicy.SOURCE)
public @interface CommandVersion {}
@@ -77,7 +77,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({COMMAND_CODE_CUSTOM,
COMMAND_CODE_PLAYER_PLAY,
COMMAND_CODE_PLAYER_PAUSE,
@@ -421,7 +421,7 @@
* Code version is {@link #COMMAND_VERSION_1}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID = 40004;
/**
@@ -430,7 +430,7 @@
* Code version is {@link #COMMAND_VERSION_1}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int COMMAND_CODE_SESSION_PLAY_FROM_SEARCH = 40005;
/**
@@ -439,7 +439,7 @@
* Code version is {@link #COMMAND_VERSION_1}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int COMMAND_CODE_SESSION_PLAY_FROM_URI = 40006;
/**
@@ -448,7 +448,7 @@
* Code version is {@link #COMMAND_VERSION_1}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID = 40007;
/**
@@ -457,7 +457,7 @@
* Code version is {@link #COMMAND_VERSION_1}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH = 40008;
/**
@@ -466,7 +466,7 @@
* Code version is {@link #COMMAND_VERSION_1}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int COMMAND_CODE_SESSION_PREPARE_FROM_URI = 40009;
/**
diff --git a/media2/src/main/java/androidx/media2/SessionCommandGroup.java b/media2/src/main/java/androidx/media2/SessionCommandGroup.java
index 3288a16..1225c89 100644
--- a/media2/src/main/java/androidx/media2/SessionCommandGroup.java
+++ b/media2/src/main/java/androidx/media2/SessionCommandGroup.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.SessionCommand.COMMAND_CODE_CUSTOM;
import static androidx.media2.SessionCommand.COMMAND_VERSION_1;
@@ -67,7 +67,7 @@
* @param command A command to add. Shouldn't be {@code null}.
* @hide TODO remove this method
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void addCommand(@NonNull SessionCommand command) {
if (command == null) {
throw new IllegalArgumentException("command shouldn't be null");
@@ -84,7 +84,7 @@
* Shouldn't be {@link SessionCommand#COMMAND_CODE_CUSTOM}.
* @hide TODO remove this method
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void addCommand(@CommandCode int commandCode) {
if (commandCode == COMMAND_CODE_CUSTOM) {
throw new IllegalArgumentException(
diff --git a/media2/src/main/java/androidx/media2/SessionPlayer.java b/media2/src/main/java/androidx/media2/SessionPlayer.java
index 0dd5ad9..bf298f7 100644
--- a/media2/src/main/java/androidx/media2/SessionPlayer.java
+++ b/media2/src/main/java/androidx/media2/SessionPlayer.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.ParcelFileDescriptor;
import android.os.SystemClock;
@@ -149,7 +149,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({
PLAYER_STATE_IDLE,
PLAYER_STATE_PAUSED,
@@ -162,7 +162,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({
BUFFERING_STATE_UNKNOWN,
BUFFERING_STATE_BUFFERING_AND_PLAYABLE,
@@ -219,7 +219,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({REPEAT_MODE_NONE, REPEAT_MODE_ONE, REPEAT_MODE_ALL,
REPEAT_MODE_GROUP})
@Retention(RetentionPolicy.SOURCE)
@@ -251,7 +251,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({SHUFFLE_MODE_NONE, SHUFFLE_MODE_ALL, SHUFFLE_MODE_GROUP})
@Retention(RetentionPolicy.SOURCE)
public @interface ShuffleMode {
@@ -884,7 +884,7 @@
RESULT_ERROR_IO_ERROR,
RESULT_INFO_SKIPPED})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface ResultCode {}
private final int mResultCode;
diff --git a/media2/src/main/java/androidx/media2/SessionResult.java b/media2/src/main/java/androidx/media2/SessionResult.java
index 23167f1..9f4d535 100644
--- a/media2/src/main/java/androidx/media2/SessionResult.java
+++ b/media2/src/main/java/androidx/media2/SessionResult.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.os.SystemClock;
@@ -73,7 +73,7 @@
RESULT_ERROR_SESSION_SKIP_LIMIT_REACHED,
RESULT_ERROR_SESSION_SETUP_REQUIRED})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface ResultCode {}
@ParcelField(1)
diff --git a/media2/src/main/java/androidx/media2/SessionToken.java b/media2/src/main/java/androidx/media2/SessionToken.java
index 0a2e259..01494db 100644
--- a/media2/src/main/java/androidx/media2/SessionToken.java
+++ b/media2/src/main/java/androidx/media2/SessionToken.java
@@ -17,7 +17,7 @@
package androidx.media2;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.ComponentName;
@@ -77,7 +77,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {TYPE_SESSION, TYPE_SESSION_SERVICE, TYPE_LIBRARY_SERVICE})
public @interface TokenType {
@@ -148,7 +148,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
SessionToken(SessionTokenImpl impl) {
mImpl = impl;
}
@@ -206,7 +206,7 @@
* @hide
* @return component name of the session. Can be {@code null} for {@link #TYPE_SESSION}.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ComponentName getComponentName() {
return mImpl.getComponentName();
}
@@ -224,7 +224,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isLegacySession() {
return mImpl.isLegacySession();
}
@@ -232,7 +232,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Object getBinder() {
return mImpl.getBinder();
}
@@ -244,7 +244,7 @@
* TODO: Consider to use this in the constructor of MediaController.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void createSessionToken(@NonNull final Context context,
@NonNull final MediaSessionCompat.Token tokenCompat, @NonNull final Executor executor,
@NonNull final OnSessionTokenCreatedListener listener) {
@@ -375,7 +375,7 @@
*
* @see #createSessionToken
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface OnSessionTokenCreatedListener {
/**
* Called when SessionToken object is created.
diff --git a/media2/src/main/java/androidx/media2/SessionTokenImplBase.java b/media2/src/main/java/androidx/media2/SessionTokenImplBase.java
index 34e8528..ac0da51 100644
--- a/media2/src/main/java/androidx/media2/SessionTokenImplBase.java
+++ b/media2/src/main/java/androidx/media2/SessionTokenImplBase.java
@@ -17,7 +17,7 @@
package androidx.media2;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.os.IBinder;
@@ -52,7 +52,7 @@
* to use by {@link MediaController} or {@link MediaBrowser}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
SessionTokenImplBase(@NonNull ComponentName serviceComponent, int uid, int type) {
if (serviceComponent == null) {
throw new IllegalArgumentException("serviceComponent shouldn't be null");
@@ -68,7 +68,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
SessionTokenImplBase(int uid, int type, String packageName, IMediaSession iSession) {
mUid = uid;
mType = type;
@@ -135,7 +135,7 @@
* @hide
* @return component name of this session token. Can be null for TYPE_SESSION.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public ComponentName getComponentName() {
return mComponentName;
diff --git a/media2/src/main/java/androidx/media2/SubtitleData.java b/media2/src/main/java/androidx/media2/SubtitleData.java
index f405377..dbc4ac6 100644
--- a/media2/src/main/java/androidx/media2/SubtitleData.java
+++ b/media2/src/main/java/androidx/media2/SubtitleData.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
@@ -91,7 +91,7 @@
/** @hide */
@RequiresApi(28)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public SubtitleData(android.media.SubtitleData subtitleData) {
mTrackIndex = subtitleData.getTrackIndex();
mStartTimeUs = subtitleData.getStartTimeUs();
@@ -100,7 +100,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public SubtitleData(int trackIndex, long startTimeUs, long durationUs, byte[] data) {
mTrackIndex = trackIndex;
mStartTimeUs = startTimeUs;
diff --git a/media2/src/main/java/androidx/media2/TimedMetaData.java b/media2/src/main/java/androidx/media2/TimedMetaData.java
index b3f44a5..6d57214c 100644
--- a/media2/src/main/java/androidx/media2/TimedMetaData.java
+++ b/media2/src/main/java/androidx/media2/TimedMetaData.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
@@ -41,7 +41,7 @@
* @hide
*/
@RequiresApi(23)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public TimedMetaData(android.media.TimedMetaData timedMetaData) {
mTimestampUs = timedMetaData.getTimestamp();
mMetaData = timedMetaData.getMetaData();
@@ -50,7 +50,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public TimedMetaData(long timestampUs, byte[] metaData) {
mTimestampUs = timestampUs;
mMetaData = metaData;
diff --git a/media2/src/main/java/androidx/media2/VideoSize.java b/media2/src/main/java/androidx/media2/VideoSize.java
index ed2f2e3..5edeef0 100644
--- a/media2/src/main/java/androidx/media2/VideoSize.java
+++ b/media2/src/main/java/androidx/media2/VideoSize.java
@@ -16,7 +16,7 @@
package androidx.media2;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -31,7 +31,7 @@
* @param height The height of the video
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public VideoSize(int width, int height) {
mWidth = width;
mHeight = height;
diff --git a/media2/src/main/java/androidx/media2/common/TrackInfoImpl.java b/media2/src/main/java/androidx/media2/common/TrackInfoImpl.java
index ec8078c..71a9316 100644
--- a/media2/src/main/java/androidx/media2/common/TrackInfoImpl.java
+++ b/media2/src/main/java/androidx/media2/common/TrackInfoImpl.java
@@ -16,7 +16,7 @@
package androidx.media2.common;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.media.MediaFormat;
@@ -29,7 +29,7 @@
* @see MediaPlayer2#getTrackInfo
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public final class TrackInfoImpl extends MediaPlayer2.TrackInfo {
private final int mTrackType;
private final MediaFormat mFormat;
diff --git a/media2/src/main/java/androidx/media2/exoplayer/ByteArrayFrame.java b/media2/src/main/java/androidx/media2/exoplayer/ByteArrayFrame.java
index b5fa694..6723611 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/ByteArrayFrame.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/ByteArrayFrame.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.Parcel;
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ final class ByteArrayFrame implements Metadata.Entry {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/DataSourceCallbackDataSource.java b/media2/src/main/java/androidx/media2/exoplayer/DataSourceCallbackDataSource.java
index bb3bf61..47f4af0 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/DataSourceCallbackDataSource.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/DataSourceCallbackDataSource.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.net.Uri;
@@ -38,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
public final class DataSourceCallbackDataSource extends BaseDataSource {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/DurationProvidingMediaSource.java b/media2/src/main/java/androidx/media2/exoplayer/DurationProvidingMediaSource.java
index 83406e4..72987d7 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/DurationProvidingMediaSource.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/DurationProvidingMediaSource.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
@@ -36,7 +36,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ class DurationProvidingMediaSource extends CompositeMediaSource<Void> {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerMediaPlayer2Impl.java b/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerMediaPlayer2Impl.java
index 483c0c5..e6ea668 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerMediaPlayer2Impl.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerMediaPlayer2Impl.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -60,7 +60,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
public final class ExoPlayerMediaPlayer2Impl extends MediaPlayer2
implements ExoPlayerWrapper.Listener {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerUtils.java b/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerUtils.java
index 6c66cd4..14ca1ba 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerUtils.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerUtils.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.MediaPlayer2.MEDIA_ERROR_IO;
import static androidx.media2.MediaPlayer2.MEDIA_ERROR_MALFORMED;
import static androidx.media2.MediaPlayer2.MEDIA_ERROR_TIMED_OUT;
@@ -73,7 +73,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ class ExoPlayerUtils {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerWrapper.java b/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerWrapper.java
index 81d8c07..5386f48 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerWrapper.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/ExoPlayerWrapper.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.MediaPlayer2.MEDIA_ERROR_UNKNOWN;
import static androidx.media2.MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE;
@@ -88,7 +88,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ final class ExoPlayerWrapper {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorDataSource.java b/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorDataSource.java
index da8ec5d..ec17bee 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorDataSource.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorDataSource.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.net.Uri;
@@ -40,7 +40,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ class FileDescriptorDataSource extends BaseDataSource {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorUtil.java b/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorUtil.java
index e97434f..20078fb 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorUtil.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/FileDescriptorUtil.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.Build;
@@ -38,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ final class FileDescriptorUtil {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/Id3MetadataDecoderFactory.java b/media2/src/main/java/androidx/media2/exoplayer/Id3MetadataDecoderFactory.java
index ae3672a..0e0ed9c 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/Id3MetadataDecoderFactory.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/Id3MetadataDecoderFactory.java
@@ -17,7 +17,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
@@ -36,7 +36,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ final class Id3MetadataDecoderFactory implements MetadataDecoderFactory {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/RenderersFactory.java b/media2/src/main/java/androidx/media2/exoplayer/RenderersFactory.java
index f262c74..2d04ff5 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/RenderersFactory.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/RenderersFactory.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -47,7 +47,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ final class RenderersFactory extends DefaultRenderersFactory {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/TextRenderer.java b/media2/src/main/java/androidx/media2/exoplayer/TextRenderer.java
index e9076c7..55314f4 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/TextRenderer.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/TextRenderer.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.os.Handler;
@@ -47,7 +47,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ class TextRenderer extends BaseRenderer {
diff --git a/media2/src/main/java/androidx/media2/exoplayer/TrackSelector.java b/media2/src/main/java/androidx/media2/exoplayer/TrackSelector.java
index 78b92bc33..4bc7878 100644
--- a/media2/src/main/java/androidx/media2/exoplayer/TrackSelector.java
+++ b/media2/src/main/java/androidx/media2/exoplayer/TrackSelector.java
@@ -16,7 +16,7 @@
package androidx.media2.exoplayer;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.media2.MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_AUDIO;
import static androidx.media2.MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_METADATA;
import static androidx.media2.MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE;
@@ -59,7 +59,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("RestrictedApi") // TODO(b/68398926): Remove once RestrictedApi checks are fixed.
/* package */ final class TrackSelector {
diff --git a/media2/src/main/java/androidx/media2/subtitle/Cea708CaptionRenderer.java b/media2/src/main/java/androidx/media2/subtitle/Cea708CaptionRenderer.java
index 0b4d8f5..d93fec3 100644
--- a/media2/src/main/java/androidx/media2/subtitle/Cea708CaptionRenderer.java
+++ b/media2/src/main/java/androidx/media2/subtitle/Cea708CaptionRenderer.java
@@ -16,7 +16,7 @@
package androidx.media2.subtitle;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Canvas;
@@ -57,7 +57,7 @@
// Note: This is forked from android.media.Cea708CaptionRenderer since P
/** @hide */
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class Cea708CaptionRenderer extends SubtitleController.Renderer {
private final Context mContext;
private Cea708CCWidget mCCWidget;
diff --git a/media2/src/main/java/androidx/media2/subtitle/ClosedCaptionRenderer.java b/media2/src/main/java/androidx/media2/subtitle/ClosedCaptionRenderer.java
index 563bbf2..d147e31 100644
--- a/media2/src/main/java/androidx/media2/subtitle/ClosedCaptionRenderer.java
+++ b/media2/src/main/java/androidx/media2/subtitle/ClosedCaptionRenderer.java
@@ -16,7 +16,7 @@
package androidx.media2.subtitle;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -47,7 +47,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ClosedCaptionRenderer extends SubtitleController.Renderer {
private static final String TAG = "ClosedCaptionRenderer";
private final Context mContext;
diff --git a/media2/src/main/java/androidx/media2/subtitle/MediaTimeProvider.java b/media2/src/main/java/androidx/media2/subtitle/MediaTimeProvider.java
index 2c2c40f..e4b340f 100644
--- a/media2/src/main/java/androidx/media2/subtitle/MediaTimeProvider.java
+++ b/media2/src/main/java/androidx/media2/subtitle/MediaTimeProvider.java
@@ -16,7 +16,7 @@
package androidx.media2.subtitle;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -24,7 +24,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public interface MediaTimeProvider {
// we do not allow negative media time
/**
diff --git a/media2/src/main/java/androidx/media2/subtitle/SubtitleController.java b/media2/src/main/java/androidx/media2/subtitle/SubtitleController.java
index 596d8f7..7b246fa 100644
--- a/media2/src/main/java/androidx/media2/subtitle/SubtitleController.java
+++ b/media2/src/main/java/androidx/media2/subtitle/SubtitleController.java
@@ -16,7 +16,7 @@
package androidx.media2.subtitle;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.media.MediaFormat;
@@ -41,7 +41,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class SubtitleController {
private MediaTimeProvider mTimeProvider;
private ArrayList<Renderer> mRenderers;
diff --git a/media2/src/main/java/androidx/media2/subtitle/SubtitleTrack.java b/media2/src/main/java/androidx/media2/subtitle/SubtitleTrack.java
index 87fc373..ea8e082 100644
--- a/media2/src/main/java/androidx/media2/subtitle/SubtitleTrack.java
+++ b/media2/src/main/java/androidx/media2/subtitle/SubtitleTrack.java
@@ -16,7 +16,7 @@
package androidx.media2.subtitle;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Canvas;
import android.media.MediaFormat;
@@ -42,7 +42,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeListener {
private static final String TAG = "SubtitleTrack";
private long mLastUpdateTimeMs;
diff --git a/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaLibraryService.java b/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaLibraryService.java
index 71f3192..ef98527 100644
--- a/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaLibraryService.java
+++ b/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaLibraryService.java
@@ -55,7 +55,6 @@
import androidx.media2.MediaLibraryService;
import androidx.media2.test.common.TestUtils;
import androidx.test.filters.LargeTest;
-import androidx.test.filters.SmallTest;
import org.junit.Ignore;
import org.junit.Test;
@@ -67,7 +66,7 @@
/**
* Tests whether {@link MediaBrowserCompat} works well with {@link MediaLibraryService}.
*/
-@SmallTest
+@LargeTest
public class MediaBrowserCompatTestWithMediaLibraryService extends
MediaBrowserCompatTestWithMediaSessionService {
@Override
@@ -175,7 +174,6 @@
}
@Test
- @LargeTest
public void testGetChildren_withLongList() throws InterruptedException {
prepareLooper();
final String testParentId = PARENT_ID_LONG_LIST;
@@ -328,7 +326,6 @@
}
@Test
- @LargeTest
public void testSearch_withLongList() throws InterruptedException {
prepareLooper();
final String testQuery = SEARCH_QUERY_LONG_LIST;
diff --git a/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaSessionService.java b/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaSessionService.java
index 5b813c0..3f33df4 100644
--- a/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaSessionService.java
+++ b/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaBrowserCompatTestWithMediaSessionService.java
@@ -27,7 +27,7 @@
import android.support.v4.media.session.MediaControllerCompat;
import androidx.media2.MediaSessionService;
-import androidx.test.filters.SmallTest;
+import androidx.test.filters.LargeTest;
import org.junit.After;
import org.junit.Before;
@@ -40,7 +40,7 @@
/**
* Tests whether {@link MediaBrowserCompat} works well with {@link MediaSessionService}.
*/
-@SmallTest
+@LargeTest
public class MediaBrowserCompatTestWithMediaSessionService extends MediaSessionTestBase {
MediaBrowserCompat mBrowserCompat;
TestConnectionCallback mConnectionCallback;
@@ -74,7 +74,8 @@
void connectAndWait() throws InterruptedException {
mBrowserCompat.connect();
- assertTrue(mConnectionCallback.mConnectedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ assertTrue(mConnectionCallback.mConnectedLatch.await(
+ BROWSER_COMPAT_CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
}
@Test
diff --git a/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaSessionTestBase.java b/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaSessionTestBase.java
index 00b8365..674c1fa 100644
--- a/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaSessionTestBase.java
+++ b/media2/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaSessionTestBase.java
@@ -60,6 +60,7 @@
*/
abstract class MediaSessionTestBase {
static final int TIMEOUT_MS = 1000;
+ static final int BROWSER_COMPAT_CONNECT_TIMEOUT_MS = 3000;
static SyncHandler sHandler;
static Executor sHandlerExecutor;
diff --git a/mediarouter/OWNERS b/mediarouter/OWNERS
index e67af3b..526fcca 100644
--- a/mediarouter/OWNERS
+++ b/mediarouter/OWNERS
@@ -1,3 +1,7 @@
-akersten@google.com
+gyumin@google.com
+hdmoon@google.com
+insun@google.com
jaewan@google.com
+jinpark@google.com
+klhyun@google.com
sungsoo@google.com
diff --git a/mediarouter/api/1.1.0-alpha02.txt b/mediarouter/api/1.1.0-alpha02.txt
new file mode 100644
index 0000000..f0c7243
--- /dev/null
+++ b/mediarouter/api/1.1.0-alpha02.txt
@@ -0,0 +1,522 @@
+// Signature format: 3.0
+package androidx.mediarouter.app {
+
+ public class MediaRouteActionProvider extends androidx.core.view.ActionProvider {
+ ctor public MediaRouteActionProvider(android.content.Context!);
+ method public void enableDynamicGroup();
+ method public androidx.mediarouter.app.MediaRouteDialogFactory getDialogFactory();
+ method public androidx.mediarouter.app.MediaRouteButton? getMediaRouteButton();
+ method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
+ method public android.view.View! onCreateActionView();
+ method public androidx.mediarouter.app.MediaRouteButton! onCreateMediaRouteButton();
+ method public void setAlwaysVisible(boolean);
+ method public void setDialogFactory(androidx.mediarouter.app.MediaRouteDialogFactory);
+ method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
+ }
+
+ public class MediaRouteButton extends android.view.View {
+ ctor public MediaRouteButton(android.content.Context!);
+ ctor public MediaRouteButton(android.content.Context!, android.util.AttributeSet!);
+ ctor public MediaRouteButton(android.content.Context!, android.util.AttributeSet!, int);
+ method public void enableDynamicGroup();
+ method public androidx.mediarouter.app.MediaRouteDialogFactory getDialogFactory();
+ method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void setAlwaysVisible(boolean);
+ method public void setDialogFactory(androidx.mediarouter.app.MediaRouteDialogFactory);
+ method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable!);
+ method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
+ method public boolean showDialog();
+ }
+
+ public class MediaRouteChooserDialog extends androidx.appcompat.app.AppCompatDialog {
+ ctor public MediaRouteChooserDialog(android.content.Context!);
+ ctor public MediaRouteChooserDialog(android.content.Context!, int);
+ method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
+ method public boolean onFilterRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
+ method public void onFilterRoutes(java.util.List<androidx.mediarouter.media.MediaRouter.RouteInfo>);
+ method public void refreshRoutes();
+ method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
+ }
+
+ public class MediaRouteChooserDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public MediaRouteChooserDialogFragment();
+ method public androidx.mediarouter.media.MediaRouteSelector! getRouteSelector();
+ method public androidx.mediarouter.app.MediaRouteChooserDialog! onCreateChooserDialog(android.content.Context!, android.os.Bundle!);
+ method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
+ }
+
+ public class MediaRouteControllerDialog extends androidx.appcompat.app.AlertDialog {
+ ctor public MediaRouteControllerDialog(android.content.Context!);
+ ctor public MediaRouteControllerDialog(android.content.Context!, int);
+ method public android.view.View! getMediaControlView();
+ method public android.support.v4.media.session.MediaSessionCompat.Token! getMediaSession();
+ method public androidx.mediarouter.media.MediaRouter.RouteInfo! getRoute();
+ method public boolean isVolumeControlEnabled();
+ method public android.view.View! onCreateMediaControlView(android.os.Bundle!);
+ method public void setVolumeControlEnabled(boolean);
+ }
+
+ public class MediaRouteControllerDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public MediaRouteControllerDialogFragment();
+ method public androidx.mediarouter.app.MediaRouteControllerDialog! onCreateControllerDialog(android.content.Context!, android.os.Bundle!);
+ }
+
+ public class MediaRouteDialogFactory {
+ ctor public MediaRouteDialogFactory();
+ method public static androidx.mediarouter.app.MediaRouteDialogFactory getDefault();
+ method public androidx.mediarouter.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
+ method public androidx.mediarouter.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
+ }
+
+ public class MediaRouteDiscoveryFragment extends androidx.fragment.app.Fragment {
+ ctor public MediaRouteDiscoveryFragment();
+ method public androidx.mediarouter.media.MediaRouter! getMediaRouter();
+ method public androidx.mediarouter.media.MediaRouteSelector! getRouteSelector();
+ method public androidx.mediarouter.media.MediaRouter.Callback! onCreateCallback();
+ method public int onPrepareCallbackFlags();
+ method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
+ }
+
+}
+
+package androidx.mediarouter.media {
+
+ public final class MediaControlIntent {
+ field public static final String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
+ field public static final String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
+ field public static final String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
+ field public static final String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
+ field public static final String ACTION_PAUSE = "android.media.intent.action.PAUSE";
+ field public static final String ACTION_PLAY = "android.media.intent.action.PLAY";
+ field public static final String ACTION_REMOVE = "android.media.intent.action.REMOVE";
+ field public static final String ACTION_RESUME = "android.media.intent.action.RESUME";
+ field public static final String ACTION_SEEK = "android.media.intent.action.SEEK";
+ field public static final String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
+ field public static final String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
+ field public static final String ACTION_STOP = "android.media.intent.action.STOP";
+ field public static final String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+ field public static final String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+ field public static final String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
+ field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
+ field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
+ field public static final int ERROR_UNKNOWN = 0; // 0x0
+ field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
+ field public static final String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
+ field public static final String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
+ field public static final String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
+ field public static final String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
+ field public static final String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
+ field public static final String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
+ field public static final String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
+ field public static final String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
+ field public static final String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_RECEIVER";
+ field public static final String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
+ field public static final String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
+ field public static final String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
+ }
+
+ public final class MediaItemMetadata {
+ field public static final String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+ field public static final String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
+ field public static final String KEY_ARTIST = "android.media.metadata.ARTIST";
+ field public static final String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
+ field public static final String KEY_AUTHOR = "android.media.metadata.AUTHOR";
+ field public static final String KEY_COMPOSER = "android.media.metadata.COMPOSER";
+ field public static final String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+ field public static final String KEY_DURATION = "android.media.metadata.DURATION";
+ field public static final String KEY_TITLE = "android.media.metadata.TITLE";
+ field public static final String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+ field public static final String KEY_YEAR = "android.media.metadata.YEAR";
+ }
+
+ public final class MediaItemStatus {
+ method public android.os.Bundle! asBundle();
+ method public static androidx.mediarouter.media.MediaItemStatus! fromBundle(android.os.Bundle!);
+ method public long getContentDuration();
+ method public long getContentPosition();
+ method public android.os.Bundle! getExtras();
+ method public int getPlaybackState();
+ method public long getTimestamp();
+ field public static final String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
+ field public static final String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
+ field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
+ field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
+ field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
+ field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
+ field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
+ field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
+ field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
+ field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
+ }
+
+ public static final class MediaItemStatus.Builder {
+ ctor public MediaItemStatus.Builder(int);
+ ctor public MediaItemStatus.Builder(androidx.mediarouter.media.MediaItemStatus!);
+ method public androidx.mediarouter.media.MediaItemStatus! build();
+ method public androidx.mediarouter.media.MediaItemStatus.Builder! setContentDuration(long);
+ method public androidx.mediarouter.media.MediaItemStatus.Builder! setContentPosition(long);
+ method public androidx.mediarouter.media.MediaItemStatus.Builder! setExtras(android.os.Bundle!);
+ method public androidx.mediarouter.media.MediaItemStatus.Builder! setPlaybackState(int);
+ method public androidx.mediarouter.media.MediaItemStatus.Builder! setTimestamp(long);
+ }
+
+ public final class MediaRouteDescriptor {
+ method public android.os.Bundle! asBundle();
+ method public boolean canDisconnectAndKeepPlaying();
+ method public static androidx.mediarouter.media.MediaRouteDescriptor! fromBundle(android.os.Bundle!);
+ method public int getConnectionState();
+ method public java.util.List<android.content.IntentFilter>! getControlFilters();
+ method public String! getDescription();
+ method public int getDeviceType();
+ method public android.os.Bundle! getExtras();
+ method public android.net.Uri! getIconUri();
+ method public String! getId();
+ method public String! getName();
+ method public int getPlaybackStream();
+ method public int getPlaybackType();
+ method public int getPresentationDisplayId();
+ method public android.content.IntentSender! getSettingsActivity();
+ method public int getVolume();
+ method public int getVolumeHandling();
+ method public int getVolumeMax();
+ method @Deprecated public boolean isConnecting();
+ method public boolean isDynamicGroupRoute();
+ method public boolean isEnabled();
+ method public boolean isValid();
+ }
+
+ public static final class MediaRouteDescriptor.Builder {
+ ctor public MediaRouteDescriptor.Builder(String!, String!);
+ ctor public MediaRouteDescriptor.Builder(androidx.mediarouter.media.MediaRouteDescriptor!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! addControlFilter(android.content.IntentFilter!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! addControlFilters(java.util.Collection<android.content.IntentFilter>!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor! build();
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setCanDisconnect(boolean);
+ method @Deprecated public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setConnecting(boolean);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setConnectionState(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setDescription(String!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setDeviceType(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setEnabled(boolean);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setExtras(android.os.Bundle!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setIconUri(android.net.Uri!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setId(String!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setIsDynamicGroupRoute(boolean);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setName(String!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setPlaybackStream(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setPlaybackType(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setPresentationDisplayId(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setSettingsActivity(android.content.IntentSender!);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setVolume(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setVolumeHandling(int);
+ method public androidx.mediarouter.media.MediaRouteDescriptor.Builder! setVolumeMax(int);
+ }
+
+ public final class MediaRouteDiscoveryRequest {
+ ctor public MediaRouteDiscoveryRequest(androidx.mediarouter.media.MediaRouteSelector!, boolean);
+ method public android.os.Bundle! asBundle();
+ method public static androidx.mediarouter.media.MediaRouteDiscoveryRequest! fromBundle(android.os.Bundle!);
+ method public androidx.mediarouter.media.MediaRouteSelector! getSelector();
+ method public boolean isActiveScan();
+ method public boolean isValid();
+ }
+
+ public abstract class MediaRouteProvider {
+ ctor public MediaRouteProvider(android.content.Context);
+ method public final android.content.Context! getContext();
+ method public final androidx.mediarouter.media.MediaRouteProviderDescriptor? getDescriptor();
+ method public final androidx.mediarouter.media.MediaRouteDiscoveryRequest? getDiscoveryRequest();
+ method public final android.os.Handler! getHandler();
+ method public final androidx.mediarouter.media.MediaRouteProvider.ProviderMetadata! getMetadata();
+ method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController? onCreateDynamicGroupRouteController(String);
+ method public androidx.mediarouter.media.MediaRouteProvider.RouteController? onCreateRouteController(String);
+ method public void onDiscoveryRequestChanged(androidx.mediarouter.media.MediaRouteDiscoveryRequest?);
+ method public final void setCallback(androidx.mediarouter.media.MediaRouteProvider.Callback?);
+ method public final void setDescriptor(androidx.mediarouter.media.MediaRouteProviderDescriptor?);
+ method public final void setDiscoveryRequest(androidx.mediarouter.media.MediaRouteDiscoveryRequest!);
+ }
+
+ public abstract static class MediaRouteProvider.Callback {
+ ctor public MediaRouteProvider.Callback();
+ method public void onDescriptorChanged(androidx.mediarouter.media.MediaRouteProvider, androidx.mediarouter.media.MediaRouteProviderDescriptor?);
+ }
+
+ public abstract static class MediaRouteProvider.DynamicGroupRouteController extends androidx.mediarouter.media.MediaRouteProvider.RouteController {
+ ctor public MediaRouteProvider.DynamicGroupRouteController();
+ method public String? getGroupableSelectionTitle();
+ method public String? getTransferableSectionTitle();
+ method public abstract void onAddMemberRoute(String);
+ method public abstract void onRemoveMemberRoute(String!);
+ method public abstract void onUpdateMemberRoutes(java.util.List<java.lang.String>?);
+ method public abstract void setOnDynamicRoutesChangedListener(java.util.concurrent.Executor, androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.OnDynamicRoutesChangedListener);
+ }
+
+ public static final class MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor {
+ method public androidx.mediarouter.media.MediaRouteDescriptor getRouteDescriptor();
+ method public int getSelectionState();
+ method public boolean isGroupable();
+ method public boolean isTransferable();
+ method public boolean isUnselectable();
+ field public static final int SELECTED = 3; // 0x3
+ field public static final int SELECTING = 2; // 0x2
+ field public static final int UNSELECTED = 1; // 0x1
+ field public static final int UNSELECTING = 0; // 0x0
+ }
+
+ public static final class MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder {
+ ctor public MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder(androidx.mediarouter.media.MediaRouteDescriptor!);
+ ctor public MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder(androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor!);
+ method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor! build();
+ method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setIsGroupable(boolean);
+ method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setIsTransferable(boolean);
+ method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setIsUnselectable(boolean);
+ method public androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder! setSelectionState(int);
+ }
+
+ public static interface MediaRouteProvider.DynamicGroupRouteController.OnDynamicRoutesChangedListener {
+ method public void onRoutesChanged(androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController!, java.util.Collection<androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor>!);
+ }
+
+ public static final class MediaRouteProvider.ProviderMetadata {
+ method public android.content.ComponentName! getComponentName();
+ method public String! getPackageName();
+ }
+
+ public abstract static class MediaRouteProvider.RouteController {
+ ctor public MediaRouteProvider.RouteController();
+ method public boolean onControlRequest(android.content.Intent!, androidx.mediarouter.media.MediaRouter.ControlRequestCallback?);
+ method public void onRelease();
+ method public void onSelect();
+ method public void onSetVolume(int);
+ method public void onUnselect();
+ method public void onUnselect(int);
+ method public void onUpdateVolume(int);
+ }
+
+ public final class MediaRouteProviderDescriptor {
+ method public android.os.Bundle! asBundle();
+ method public static androidx.mediarouter.media.MediaRouteProviderDescriptor! fromBundle(android.os.Bundle!);
+ method public java.util.List<androidx.mediarouter.media.MediaRouteDescriptor> getRoutes();
+ method public boolean isValid();
+ method public boolean supportsDynamicGroupRoute();
+ }
+
+ public static final class MediaRouteProviderDescriptor.Builder {
+ ctor public MediaRouteProviderDescriptor.Builder();
+ ctor public MediaRouteProviderDescriptor.Builder(androidx.mediarouter.media.MediaRouteProviderDescriptor!);
+ method public androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder! addRoute(androidx.mediarouter.media.MediaRouteDescriptor!);
+ method public androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder! addRoutes(java.util.Collection<androidx.mediarouter.media.MediaRouteDescriptor>!);
+ method public androidx.mediarouter.media.MediaRouteProviderDescriptor! build();
+ method public androidx.mediarouter.media.MediaRouteProviderDescriptor.Builder! setSupportsDynamicGroupRoute(boolean);
+ }
+
+ public abstract class MediaRouteProviderService extends android.app.Service {
+ ctor public MediaRouteProviderService();
+ method public androidx.mediarouter.media.MediaRouteProvider! getMediaRouteProvider();
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ method public abstract androidx.mediarouter.media.MediaRouteProvider! onCreateMediaRouteProvider();
+ field public static final String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
+ }
+
+ public final class MediaRouteSelector {
+ method public android.os.Bundle! asBundle();
+ method public boolean contains(androidx.mediarouter.media.MediaRouteSelector!);
+ method public static androidx.mediarouter.media.MediaRouteSelector! fromBundle(android.os.Bundle?);
+ method public java.util.List<java.lang.String>! getControlCategories();
+ method public boolean hasControlCategory(String!);
+ method public boolean isEmpty();
+ method public boolean isValid();
+ method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>!);
+ field public static final androidx.mediarouter.media.MediaRouteSelector! EMPTY;
+ }
+
+ public static final class MediaRouteSelector.Builder {
+ ctor public MediaRouteSelector.Builder();
+ ctor public MediaRouteSelector.Builder(androidx.mediarouter.media.MediaRouteSelector);
+ method public androidx.mediarouter.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
+ method public androidx.mediarouter.media.MediaRouteSelector.Builder addControlCategory(String);
+ method public androidx.mediarouter.media.MediaRouteSelector.Builder addSelector(androidx.mediarouter.media.MediaRouteSelector);
+ method public androidx.mediarouter.media.MediaRouteSelector build();
+ }
+
+ public final class MediaRouter {
+ method public void addCallback(androidx.mediarouter.media.MediaRouteSelector!, androidx.mediarouter.media.MediaRouter.Callback!);
+ method public void addCallback(androidx.mediarouter.media.MediaRouteSelector, androidx.mediarouter.media.MediaRouter.Callback, int);
+ method public void addProvider(androidx.mediarouter.media.MediaRouteProvider);
+ method public void addRemoteControlClient(Object);
+ method public androidx.mediarouter.media.MediaRouter.RouteInfo! getBluetoothRoute();
+ method public androidx.mediarouter.media.MediaRouter.RouteInfo getDefaultRoute();
+ method public static androidx.mediarouter.media.MediaRouter! getInstance(android.content.Context);
+ method public android.support.v4.media.session.MediaSessionCompat.Token! getMediaSessionToken();
+ method public java.util.List<androidx.mediarouter.media.MediaRouter.ProviderInfo>! getProviders();
+ method public java.util.List<androidx.mediarouter.media.MediaRouter.RouteInfo>! getRoutes();
+ method public androidx.mediarouter.media.MediaRouter.RouteInfo getSelectedRoute();
+ method public boolean isRouteAvailable(androidx.mediarouter.media.MediaRouteSelector, int);
+ method public void removeCallback(androidx.mediarouter.media.MediaRouter.Callback);
+ method public void removeProvider(androidx.mediarouter.media.MediaRouteProvider);
+ method public void removeRemoteControlClient(Object);
+ method public void selectRoute(androidx.mediarouter.media.MediaRouter.RouteInfo);
+ method public void setMediaSession(Object!);
+ method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat!);
+ method public void unselect(int);
+ method public androidx.mediarouter.media.MediaRouter.RouteInfo updateSelectedRoute(androidx.mediarouter.media.MediaRouteSelector);
+ field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
+ field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
+ field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
+ field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
+ field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
+ field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
+ field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
+ field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
+ field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
+ field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
+ }
+
+ public abstract static class MediaRouter.Callback {
+ ctor public MediaRouter.Callback();
+ method public void onProviderAdded(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.ProviderInfo!);
+ method public void onProviderChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.ProviderInfo!);
+ method public void onProviderRemoved(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.ProviderInfo!);
+ method public void onRouteAdded(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void onRouteChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void onRoutePresentationDisplayChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void onRouteRemoved(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void onRouteSelected(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void onRouteUnselected(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void onRouteUnselected(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!, int);
+ method public void onRouteVolumeChanged(androidx.mediarouter.media.MediaRouter!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ }
+
+ public abstract static class MediaRouter.ControlRequestCallback {
+ ctor public MediaRouter.ControlRequestCallback();
+ method public void onError(String!, android.os.Bundle!);
+ method public void onResult(android.os.Bundle!);
+ }
+
+ public static final class MediaRouter.ProviderInfo {
+ method public android.content.ComponentName! getComponentName();
+ method public String! getPackageName();
+ method public androidx.mediarouter.media.MediaRouteProvider! getProviderInstance();
+ method public java.util.List<androidx.mediarouter.media.MediaRouter.RouteInfo>! getRoutes();
+ }
+
+ public static class MediaRouter.RouteInfo {
+ method public boolean canDisconnect();
+ method public int getConnectionState();
+ method public java.util.List<android.content.IntentFilter>! getControlFilters();
+ method public String? getDescription();
+ method public int getDeviceType();
+ method public android.os.Bundle? getExtras();
+ method public android.net.Uri! getIconUri();
+ method public String getId();
+ method public String! getName();
+ method public int getPlaybackStream();
+ method public int getPlaybackType();
+ method public android.view.Display? getPresentationDisplay();
+ method public androidx.mediarouter.media.MediaRouter.ProviderInfo! getProvider();
+ method public android.content.IntentSender? getSettingsIntent();
+ method public int getVolume();
+ method public int getVolumeHandling();
+ method public int getVolumeMax();
+ method public boolean isBluetooth();
+ method @Deprecated public boolean isConnecting();
+ method public boolean isDefault();
+ method public boolean isDeviceSpeaker();
+ method public boolean isEnabled();
+ method public boolean isSelected();
+ method public boolean matchesSelector(androidx.mediarouter.media.MediaRouteSelector);
+ method public void requestSetVolume(int);
+ method public void requestUpdateVolume(int);
+ method public void select();
+ method public void sendControlRequest(android.content.Intent, androidx.mediarouter.media.MediaRouter.ControlRequestCallback?);
+ method public boolean supportsControlAction(String, String);
+ method public boolean supportsControlCategory(String);
+ method public boolean supportsControlRequest(android.content.Intent);
+ field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
+ field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
+ field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
+ field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
+ field public static final int DEVICE_TYPE_TV = 1; // 0x1
+ field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
+ field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
+ field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
+ field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
+ }
+
+ public final class MediaSessionStatus {
+ method public android.os.Bundle! asBundle();
+ method public static androidx.mediarouter.media.MediaSessionStatus! fromBundle(android.os.Bundle!);
+ method public android.os.Bundle! getExtras();
+ method public int getSessionState();
+ method public long getTimestamp();
+ method public boolean isQueuePaused();
+ field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
+ field public static final int SESSION_STATE_ENDED = 1; // 0x1
+ field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
+ }
+
+ public static final class MediaSessionStatus.Builder {
+ ctor public MediaSessionStatus.Builder(int);
+ ctor public MediaSessionStatus.Builder(androidx.mediarouter.media.MediaSessionStatus!);
+ method public androidx.mediarouter.media.MediaSessionStatus! build();
+ method public androidx.mediarouter.media.MediaSessionStatus.Builder! setExtras(android.os.Bundle!);
+ method public androidx.mediarouter.media.MediaSessionStatus.Builder! setQueuePaused(boolean);
+ method public androidx.mediarouter.media.MediaSessionStatus.Builder! setSessionState(int);
+ method public androidx.mediarouter.media.MediaSessionStatus.Builder! setTimestamp(long);
+ }
+
+ public class RemotePlaybackClient {
+ ctor public RemotePlaybackClient(android.content.Context!, androidx.mediarouter.media.MediaRouter.RouteInfo!);
+ method public void endSession(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ method public void enqueue(android.net.Uri!, String!, android.os.Bundle!, long, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
+ method public String! getSessionId();
+ method public void getSessionStatus(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ method public void getStatus(String!, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
+ method public boolean hasSession();
+ method public boolean isMessagingSupported();
+ method public boolean isQueuingSupported();
+ method public boolean isRemotePlaybackSupported();
+ method public boolean isSessionManagementSupported();
+ method public void pause(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ method public void play(android.net.Uri!, String!, android.os.Bundle!, long, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
+ method public void release();
+ method public void remove(String!, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
+ method public void resume(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ method public void seek(String!, long, android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.ItemActionCallback!);
+ method public void sendMessage(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ method public void setOnMessageReceivedListener(androidx.mediarouter.media.RemotePlaybackClient.OnMessageReceivedListener!);
+ method public void setSessionId(String!);
+ method public void setStatusCallback(androidx.mediarouter.media.RemotePlaybackClient.StatusCallback!);
+ method public void startSession(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ method public void stop(android.os.Bundle!, androidx.mediarouter.media.RemotePlaybackClient.SessionActionCallback!);
+ }
+
+ public abstract static class RemotePlaybackClient.ActionCallback {
+ ctor public RemotePlaybackClient.ActionCallback();
+ method public void onError(String!, int, android.os.Bundle!);
+ }
+
+ public abstract static class RemotePlaybackClient.ItemActionCallback extends androidx.mediarouter.media.RemotePlaybackClient.ActionCallback {
+ ctor public RemotePlaybackClient.ItemActionCallback();
+ method public void onResult(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!, String!, androidx.mediarouter.media.MediaItemStatus!);
+ }
+
+ public static interface RemotePlaybackClient.OnMessageReceivedListener {
+ method public void onMessageReceived(String!, android.os.Bundle!);
+ }
+
+ public abstract static class RemotePlaybackClient.SessionActionCallback extends androidx.mediarouter.media.RemotePlaybackClient.ActionCallback {
+ ctor public RemotePlaybackClient.SessionActionCallback();
+ method public void onResult(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!);
+ }
+
+ public abstract static class RemotePlaybackClient.StatusCallback {
+ ctor public RemotePlaybackClient.StatusCallback();
+ method public void onItemStatusChanged(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!, String!, androidx.mediarouter.media.MediaItemStatus!);
+ method public void onSessionChanged(String!);
+ method public void onSessionStatusChanged(android.os.Bundle!, String!, androidx.mediarouter.media.MediaSessionStatus!);
+ }
+
+}
+
diff --git a/mediarouter/api/current.txt b/mediarouter/api/current.txt
index c5be66c..f0c7243 100644
--- a/mediarouter/api/current.txt
+++ b/mediarouter/api/current.txt
@@ -9,6 +9,7 @@
method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
method public android.view.View! onCreateActionView();
method public androidx.mediarouter.app.MediaRouteButton! onCreateMediaRouteButton();
+ method public void setAlwaysVisible(boolean);
method public void setDialogFactory(androidx.mediarouter.app.MediaRouteDialogFactory);
method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector);
}
@@ -22,6 +23,7 @@
method public androidx.mediarouter.media.MediaRouteSelector getRouteSelector();
method public void onAttachedToWindow();
method public void onDetachedFromWindow();
+ method public void setAlwaysVisible(boolean);
method public void setDialogFactory(androidx.mediarouter.app.MediaRouteDialogFactory);
method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable!);
method public void setRouteSelector(androidx.mediarouter.media.MediaRouteSelector!);
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/mediarouter/api/res-1.1.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to mediarouter/api/res-1.1.0-alpha02.txt
diff --git a/mediarouter/jellybean/androidx/mediarouter/media/MediaRouterJellybean.java b/mediarouter/jellybean/androidx/mediarouter/media/MediaRouterJellybean.java
index d73edb7..36bd97b 100644
--- a/mediarouter/jellybean/androidx/mediarouter/media/MediaRouterJellybean.java
+++ b/mediarouter/jellybean/androidx/mediarouter/media/MediaRouterJellybean.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
import android.os.Build;
import android.util.Log;
@@ -120,19 +119,6 @@
return new VolumeCallbackProxy<VolumeCallback>(callback);
}
- static boolean checkRoutedToBluetooth(Context context) {
- try {
- AudioManager audioManager = (AudioManager) context.getSystemService(
- Context.AUDIO_SERVICE);
- Method method = audioManager.getClass().getDeclaredMethod(
- "getDevicesForStream", int.class);
- int device = (Integer) method.invoke(audioManager, AudioManager.STREAM_MUSIC);
- return (device & DEVICE_OUT_BLUETOOTH) != 0;
- } catch (Exception e) {
- return false;
- }
- }
-
public static final class RouteInfo {
public static CharSequence getName(Object routeObj, Context context) {
return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context);
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
index cb22394..191f9e0 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
@@ -138,6 +138,7 @@
private MediaRouteDialogFactory mDialogFactory = MediaRouteDialogFactory.getDefault();
private MediaRouteButton mButton;
private boolean mUseDynamicGroup;
+ private boolean mAlwaysVisible;
/**
* Creates the action provider.
@@ -207,6 +208,24 @@
}
/**
+ * Sets weather {@link MediaRouteButton} is visible when no routes are available.
+ * When true, the button is visible even if there are no routes to connect.
+ *
+ * @param alwaysVisible true to show MediaRouteButton always.
+ *
+ * @see MediaRouteButton#setAlwaysVisible(boolean)
+ */
+ public void setAlwaysVisible(boolean alwaysVisible) {
+ if (mAlwaysVisible != alwaysVisible) {
+ mAlwaysVisible = alwaysVisible;
+ refreshVisibility();
+ if (mButton != null) {
+ mButton.setAlwaysVisible(mAlwaysVisible);
+ }
+ }
+ }
+
+ /**
* Gets the media route dialog factory to use when showing the route chooser
* or controller dialog.
*
@@ -270,6 +289,7 @@
if (mUseDynamicGroup) {
mButton.enableDynamicGroup();
}
+ mButton.setAlwaysVisible(mAlwaysVisible);
mButton.setDialogFactory(mDialogFactory);
mButton.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
@@ -292,7 +312,7 @@
@Override
public boolean isVisible() {
- return mRouter.isRouteAvailable(mSelector,
+ return mAlwaysVisible || mRouter.isRouteAvailable(mSelector,
MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE);
}
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index 0dbd32c..ad51a2a 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -125,6 +125,7 @@
private int mMinHeight;
private boolean mUseDynamicGroup;
+ private boolean mAlwaysVisible;
// The checked state is used when connected to a remote route.
private static final int[] CHECKED_STATE_SET = {
@@ -182,7 +183,8 @@
if (remoteIndicatorStaticState != null) {
setRemoteIndicatorDrawableInternal(remoteIndicatorStaticState.newDrawable());
} else {
- mRemoteIndicatorLoader = new RemoteIndicatorLoader(remoteIndicatorStaticResId);
+ mRemoteIndicatorLoader = new RemoteIndicatorLoader(remoteIndicatorStaticResId,
+ getContext());
mRemoteIndicatorLoader.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
}
@@ -397,6 +399,23 @@
setRemoteIndicatorDrawableInternal(d);
}
+ /**
+ * Sets weather the button is visible when no routes are available.
+ * When true, the button is visible even if there are no routes to connect.
+ * You may want to override {@link View#performClick()} to change the behavior
+ * when the button is clicked.
+ * It doesn't overrides the {@link View#getVisibility visibility} status of the button.
+ *
+ * @param alwaysVisible true to show button always.
+ */
+ public void setAlwaysVisible(boolean alwaysVisible) {
+ if (alwaysVisible != mAlwaysVisible) {
+ mAlwaysVisible = alwaysVisible;
+ refreshVisibility();
+ refreshRoute();
+ }
+ }
+
@Override
protected boolean verifyDrawable(Drawable who) {
return super.verifyDrawable(who) || who == mRemoteIndicator;
@@ -516,7 +535,8 @@
if (mRemoteIndicatorLoader != null) {
mRemoteIndicatorLoader.cancel(false);
}
- mRemoteIndicatorLoader = new RemoteIndicatorLoader(mRemoteIndicatorResIdToLoad);
+ mRemoteIndicatorLoader = new RemoteIndicatorLoader(mRemoteIndicatorResIdToLoad,
+ getContext());
mRemoteIndicatorResIdToLoad = 0;
mRemoteIndicatorLoader.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
@@ -560,7 +580,8 @@
}
void refreshVisibility() {
- super.setVisibility(mVisibility == VISIBLE && !sConnectivityReceiver.isConnected()
+ super.setVisibility(mVisibility == VISIBLE
+ && !(mAlwaysVisible || sConnectivityReceiver.isConnected())
? INVISIBLE : mVisibility);
if (mRemoteIndicator != null) {
mRemoteIndicator.setVisible(getVisibility() == VISIBLE, false);
@@ -589,7 +610,7 @@
}
if (mAttachedToWindow) {
- setEnabled(mRouter.isRouteAvailable(mSelector,
+ setEnabled(mAlwaysVisible || mRouter.isRouteAvailable(mSelector,
MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
}
if (mRemoteIndicator != null
@@ -675,16 +696,18 @@
private final class RemoteIndicatorLoader extends AsyncTask<Void, Void, Drawable> {
private final int mResId;
+ private final Context mContext;
- RemoteIndicatorLoader(int resId) {
+ RemoteIndicatorLoader(int resId, Context context) {
mResId = resId;
+ mContext = context;
}
@Override
protected Drawable doInBackground(Void... params) {
Drawable.ConstantState remoteIndicatorState = sRemoteIndicatorCache.get(mResId);
if (remoteIndicatorState == null) {
- return getContext().getResources().getDrawable(mResId);
+ return mContext.getResources().getDrawable(mResId);
} else {
return null;
}
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteCastDialog.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteCastDialog.java
index 2ced044..6560d8f 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteCastDialog.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteCastDialog.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentResolver;
import android.content.Context;
@@ -97,7 +97,7 @@
* @see MediaRouteActionProvider
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MediaRouteCastDialog extends AppCompatDialog {
static final String TAG = "MediaRouteCastDialog";
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
index 59c88e2..08e087a 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Dialog;
import android.content.Context;
@@ -122,7 +122,7 @@
* Called when the device picker dialog is being created.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaRouteDevicePickerDialog onCreateDevicePickerDialog(Context context) {
return new MediaRouteDevicePickerDialog(context);
}
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
index b4580a5..15d8e8f 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Dialog;
import android.content.Context;
@@ -56,7 +56,7 @@
* @return The selector, never null.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaRouteSelector getRouteSelector() {
ensureRouteSelector();
return mSelector;
@@ -95,7 +95,7 @@
* @param selector The selector to set.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setRouteSelector(MediaRouteSelector selector) {
if (selector == null) {
throw new IllegalArgumentException("selector must not be null");
@@ -124,7 +124,7 @@
* Called when the cast dialog is being created.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaRouteCastDialog onCreateCastDialog(Context context) {
return new MediaRouteCastDialog(context);
}
diff --git a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDevicePickerDialog.java b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDevicePickerDialog.java
index 0aa336c..b16d038 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDevicePickerDialog.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDevicePickerDialog.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.app;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Drawable;
@@ -60,7 +60,7 @@
* @see MediaRouteActionProvider
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class MediaRouteDevicePickerDialog extends AppCompatDialog {
private static final String TAG = "MediaRouteDevicePickerDialog";
diff --git a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
index a9c4deb..9279e58 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
@@ -15,7 +15,7 @@
*/
package androidx.mediarouter.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.IntentFilter;
import android.content.IntentSender;
@@ -92,7 +92,7 @@
* </p>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public List<String> getGroupMemberIds() {
ensureGroupMemberIds();
return mGroupMemberIds;
@@ -310,7 +310,7 @@
* Gets the minimum client version required for this route.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getMinClientVersion() {
return mBundle.getInt(KEY_MIN_CLIENT_VERSION,
MediaRouteProviderProtocol.CLIENT_VERSION_START);
@@ -320,7 +320,7 @@
* Gets the maximum client version required for this route.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getMaxClientVersion() {
return mBundle.getInt(KEY_MAX_CLIENT_VERSION, Integer.MAX_VALUE);
}
@@ -446,7 +446,7 @@
* </p>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder addGroupMemberId(String groupMemberId) {
if (TextUtils.isEmpty(groupMemberId)) {
throw new IllegalArgumentException("groupMemberId must not be empty");
@@ -469,7 +469,7 @@
* </p>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder addGroupMemberIds(Collection<String> groupMemberIds) {
if (groupMemberIds == null) {
throw new IllegalArgumentException("groupMemberIds must not be null");
@@ -491,7 +491,7 @@
* </p>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder removeGroupMemberId(String memberRouteId) {
if (TextUtils.isEmpty(memberRouteId)) {
throw new IllegalArgumentException("memberRouteId must not be empty");
@@ -726,7 +726,7 @@
* A router whose version is lower than this will not be able to connect to this route.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder setMinClientVersion(int minVersion) {
mBundle.putInt(KEY_MIN_CLIENT_VERSION, minVersion);
return this;
@@ -737,7 +737,7 @@
* A router whose version is higher than this will not be able to connect to this route.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder setMaxClientVersion(int maxVersion) {
mBundle.putInt(KEY_MAX_CLIENT_VERSION, maxVersion);
return this;
diff --git a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
index 43e2696..b9b168f 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.content.Context;
@@ -283,7 +283,7 @@
* cannot be controlled using the route controller interface.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
public RouteController onCreateRouteController(@NonNull String routeId,
@NonNull String routeGroupId) {
@@ -541,7 +541,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({
UNSELECTING,
UNSELECTED,
diff --git a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
index b0d2a2e..a008054 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
@@ -839,7 +839,8 @@
case CLIENT_MSG_CREATE_ROUTE_CONTROLLER: {
String routeId = data.getString(CLIENT_DATA_ROUTE_ID);
- String routeGroupId = data.getString(CLIENT_DATA_ROUTE_LIBRARY_GROUP);
+ String routeGroupId =
+ data.getString(CLIENT_DATA_ROUTE_LIBRARY_GROUP);
if (routeId != null) {
return service.onCreateRouteController(
messenger, requestId, arg, routeId, routeGroupId);
diff --git a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
index b897495..3e6d598 100644
--- a/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
+++ b/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.media;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
@@ -452,7 +452,7 @@
* Adds the specified route as a member to the current dynamic group.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void addMemberToSelectedRoute(RouteInfo route) {
checkCallingThread();
sGlobal.addMemberToSelectedRoute(route);
@@ -462,7 +462,7 @@
* Removes the specified route from the current dynamic group.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void removeMemberFromSelectedRoute(RouteInfo route) {
checkCallingThread();
sGlobal.removeMemberFromSelectedRoute(route);
@@ -908,7 +908,7 @@
* @see #getDeviceType
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int DEVICE_TYPE_UNKNOWN = 0;
/**
@@ -934,7 +934,7 @@
* @see #getDeviceType
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int DEVICE_TYPE_BLUETOOTH = 3;
@IntDef({PLAYBACK_VOLUME_FIXED,PLAYBACK_VOLUME_VARIABLE})
@@ -964,7 +964,7 @@
* with the route.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final int PRESENTATION_DISPLAY_ID_NONE = -1;
static final int CHANGE_GENERAL = 1 << 0;
@@ -1082,7 +1082,7 @@
* {@link DynamicRouteDescriptor#SELECTING}, or {@link DynamicRouteDescriptor#SELECTED}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getSelectionState() {
return (mDynamicDescriptor != null) ? mDynamicDescriptor.getSelectionState()
: DynamicRouteDescriptor.UNSELECTED;
@@ -1334,7 +1334,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isDefaultOrBluetooth() {
if (isDefault() || mDeviceType == DEVICE_TYPE_BLUETOOTH) {
return true;
@@ -1474,7 +1474,7 @@
* Gets the route's presentation display id, or -1 if none.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int getPresentationDisplayId() {
return mPresentationDisplayId;
}
@@ -1509,7 +1509,7 @@
* Returns true if the route has one or more members
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isGroup() {
return getMemberRoutes().size() >= 1;
}
@@ -1518,7 +1518,7 @@
* Returns true if the route is a dynamic group
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isDynamicRoute() {
// If the provider of the route supports dynamic group, it should be a dynamic group.
return getProvider() != null && getProvider().supportsDynamicGroup();
@@ -1528,7 +1528,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isUnselectable() {
return mDynamicDescriptor == null || mDynamicDescriptor.isUnselectable();
}
@@ -1537,7 +1537,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isGroupable() {
return mDynamicDescriptor != null && mDynamicDescriptor.isGroupable();
}
@@ -1546,7 +1546,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isTransferable() {
return mDynamicDescriptor != null && mDynamicDescriptor.isTransferable();
}
@@ -1557,7 +1557,7 @@
* @hide
* @return The list of the routes in this group
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
public List<RouteInfo> getMemberRoutes() {
return Collections.unmodifiableList(mMemberRoutes);
@@ -1567,7 +1567,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
public DynamicGroupRouteController getDynamicGroupController() {
//TODO: handle multiple controllers case
@@ -1771,7 +1771,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public MediaRouteProvider getProviderInstance() {
return mProvider.getProviderInstance();
}
diff --git a/navigation/common/api/1.0.0-beta02.txt b/navigation/common/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..6dd3420
--- /dev/null
+++ b/navigation/common/api/1.0.0-beta02.txt
@@ -0,0 +1,192 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+ ctor public ActionOnlyNavDirections(int);
+ method public int getActionId();
+ method public android.os.Bundle getArguments();
+ }
+
+ public final class NavAction {
+ ctor public NavAction(@IdRes int);
+ ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+ ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+ method public android.os.Bundle? getDefaultArguments();
+ method public int getDestinationId();
+ method public androidx.navigation.NavOptions? getNavOptions();
+ method public void setDefaultArguments(android.os.Bundle?);
+ method public void setNavOptions(androidx.navigation.NavOptions?);
+ }
+
+ public interface NavArgs {
+ }
+
+ public final class NavArgument {
+ method public Object? getDefaultValue();
+ method public androidx.navigation.NavType<?> getType();
+ method public boolean isDefaultValuePresent();
+ method public boolean isNullable();
+ }
+
+ public static final class NavArgument.Builder {
+ ctor public NavArgument.Builder();
+ method public androidx.navigation.NavArgument build();
+ method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+ method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+ method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+ }
+
+ public class NavDestination {
+ ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ ctor public NavDestination(String);
+ method public final void addArgument(String, androidx.navigation.NavArgument);
+ method public final void addDeepLink(String);
+ method public final androidx.navigation.NavAction? getAction(@IdRes int);
+ method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
+ method @IdRes public final int getId();
+ method public final CharSequence? getLabel();
+ method public final String getNavigatorName();
+ method public final androidx.navigation.NavGraph? getParent();
+ method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+ method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+ method public final void putAction(@IdRes int, @IdRes int);
+ method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+ method public final void removeAction(@IdRes int);
+ method public final void removeArgument(String);
+ method public final void setId(@IdRes int);
+ method public final void setLabel(CharSequence?);
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+ method public abstract Class value();
+ }
+
+ public interface NavDirections {
+ method @IdRes public int getActionId();
+ method public android.os.Bundle getArguments();
+ }
+
+ public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+ ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+ method public final void addAll(androidx.navigation.NavGraph);
+ method public final void addDestination(androidx.navigation.NavDestination);
+ method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination>);
+ method public final void addDestinations(androidx.navigation.NavDestination...);
+ method public final void clear();
+ method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+ method @IdRes public final int getStartDestination();
+ method public final java.util.Iterator<androidx.navigation.NavDestination> iterator();
+ method public final void remove(androidx.navigation.NavDestination);
+ method public final void setStartDestination(@IdRes int);
+ }
+
+ @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+ ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+ method public androidx.navigation.NavGraph createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ public final class NavOptions {
+ method @AnimRes @AnimatorRes public int getEnterAnim();
+ method @AnimRes @AnimatorRes public int getExitAnim();
+ method @AnimRes @AnimatorRes public int getPopEnterAnim();
+ method @AnimRes @AnimatorRes public int getPopExitAnim();
+ method @IdRes public int getPopUpTo();
+ method public boolean isPopUpToInclusive();
+ method public boolean shouldLaunchSingleTop();
+ }
+
+ public static final class NavOptions.Builder {
+ ctor public NavOptions.Builder();
+ method public androidx.navigation.NavOptions build();
+ method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+ method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+ }
+
+ public abstract class NavType<T> {
+ method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+ method public abstract T? get(android.os.Bundle, String);
+ method public abstract String getName();
+ method public boolean isNullableAllowed();
+ method public abstract T parseValue(String);
+ method public abstract void put(android.os.Bundle, String, T?);
+ field public static final androidx.navigation.NavType<boolean[]> BoolArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Boolean> BoolType;
+ field public static final androidx.navigation.NavType<float[]> FloatArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Float> FloatType;
+ field public static final androidx.navigation.NavType<int[]> IntArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Integer> IntType;
+ field public static final androidx.navigation.NavType<long[]> LongArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Long> LongType;
+ field public static final androidx.navigation.NavType<java.lang.Integer> ReferenceType;
+ field public static final androidx.navigation.NavType<java.lang.String[]> StringArrayType;
+ field public static final androidx.navigation.NavType<java.lang.String> StringType;
+ }
+
+ public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+ ctor public NavType.EnumType(Class<D>);
+ }
+
+ public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+ ctor public NavType.ParcelableArrayType(Class<D>);
+ method public D[]? get(android.os.Bundle, String);
+ method public String getName();
+ method public D[] parseValue(String);
+ method public void put(android.os.Bundle, String, D[]?);
+ }
+
+ public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+ ctor public NavType.ParcelableType(Class<D>);
+ method public D? get(android.os.Bundle, String);
+ method public String getName();
+ method public D parseValue(String);
+ method public void put(android.os.Bundle, String, D?);
+ }
+
+ public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+ ctor public NavType.SerializableArrayType(Class<D>);
+ method public D[]? get(android.os.Bundle, String);
+ method public String getName();
+ method public D[] parseValue(String);
+ method public void put(android.os.Bundle, String, D[]?);
+ }
+
+ public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+ ctor public NavType.SerializableType(Class<D>);
+ method public D? get(android.os.Bundle, String);
+ method public String getName();
+ method public D parseValue(String);
+ method public void put(android.os.Bundle, String, D?);
+ }
+
+ public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+ ctor public Navigator();
+ method public abstract D createDestination();
+ method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void onRestoreState(android.os.Bundle);
+ method public android.os.Bundle? onSaveState();
+ method public abstract boolean popBackStack();
+ }
+
+ public static interface Navigator.Extras {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+ method public abstract String value();
+ }
+
+ public class NavigatorProvider {
+ ctor public NavigatorProvider();
+ method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T>);
+ method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/common/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/common/api/res-1.0.0-beta02.txt
diff --git a/navigation/common/ktx/api/1.0.0-beta02.txt b/navigation/common/ktx/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..6da57db
--- /dev/null
+++ b/navigation/common/ktx/api/1.0.0-beta02.txt
@@ -0,0 +1,129 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+ ctor public AnimBuilder();
+ method public int getEnter();
+ method public int getExit();
+ method public int getPopEnter();
+ method public int getPopExit();
+ method public void setEnter(int p);
+ method public void setExit(int p);
+ method public void setPopEnter(int p);
+ method public void setPopExit(int p);
+ property public final int enter;
+ property public final int exit;
+ property public final int popEnter;
+ property public final int popExit;
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+ ctor public NavActionBuilder();
+ method public int getDestinationId();
+ method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+ method public void setDestinationId(int p);
+ property public final int destinationId;
+ }
+
+ public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+ ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+ method public Args getValue();
+ method public boolean isInitialized();
+ property public Args value;
+ }
+
+ public final class NavArgsLazyKt {
+ ctor public NavArgsLazyKt();
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+ ctor public NavArgumentBuilder();
+ method public androidx.navigation.NavArgument build();
+ method public Object? getDefaultValue();
+ method public boolean getNullable();
+ method public androidx.navigation.NavType<?> getType();
+ method public void setDefaultValue(Object? value);
+ method public void setNullable(boolean value);
+ method public void setType(androidx.navigation.NavType<?> value);
+ property public final Object? defaultValue;
+ property public final boolean nullable;
+ property public final androidx.navigation.NavType<?> type;
+ }
+
+ @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+ ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+ method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+ method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+ method public D build();
+ method public final void deepLink(String uriPattern);
+ method public final int getId();
+ method public final CharSequence? getLabel();
+ method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+ method public final void setLabel(CharSequence? p);
+ property public final CharSequence? label;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface NavDestinationDsl {
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+ ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+ method public void addDestination(androidx.navigation.NavDestination destination);
+ method public androidx.navigation.NavGraph build();
+ method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+ method public androidx.navigation.NavigatorProvider getProvider();
+ method public operator void unaryPlus(androidx.navigation.NavDestination);
+ }
+
+ public final class NavGraphBuilderKt {
+ ctor public NavGraphBuilderKt();
+ method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class NavGraphKt {
+ ctor public NavGraphKt();
+ method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+ method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+ method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+ method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+ method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+ }
+
+ @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+ ctor public NavOptionsBuilder();
+ method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+ method public boolean getLaunchSingleTop();
+ method public int getPopUpTo();
+ method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+ method public void setLaunchSingleTop(boolean p);
+ method public void setPopUpTo(int value);
+ property public final boolean launchSingleTop;
+ property public final int popUpTo;
+ }
+
+ public final class NavOptionsBuilderKt {
+ ctor public NavOptionsBuilderKt();
+ method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface NavOptionsDsl {
+ }
+
+ public final class NavigatorProviderKt {
+ ctor public NavigatorProviderKt();
+ method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+ method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+ method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+ method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+ }
+
+ @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+ ctor public PopUpToBuilder();
+ method public boolean getInclusive();
+ method public void setInclusive(boolean p);
+ property public final boolean inclusive;
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/common/ktx/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/common/ktx/api/res-1.0.0-beta02.txt
diff --git a/navigation/common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt b/navigation/common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
index 3a090c0..09cc1fc 100644
--- a/navigation/common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
+++ b/navigation/common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
@@ -42,11 +42,50 @@
.isNotNull()
assertWithMessage("Deep link should extract id argument correctly")
- .that(match?.second?.getInt("id"))
+ .that(match?.matchingArgs?.getInt("id"))
.isEqualTo(43)
}
@Test
+ fun matchDeepLinkBestMatchExact() {
+ val destination = NoOpNavigator().createDestination()
+
+ destination.addDeepLink("www.example.com/users/index.html")
+
+ val idArgument = NavArgument.Builder()
+ .setType(NavType.StringType)
+ .build()
+ destination.addArgument("id", idArgument)
+ destination.addDeepLink("www.example.com/users/{name}")
+
+ val match = destination.matchDeepLink(
+ Uri.parse("https://www.example.com/users/index.html"))
+
+ assertWithMessage("Deep link should match")
+ .that(match)
+ .isNotNull()
+ assertWithMessage("Deep link should pick the exact match")
+ .that(match?.matchingArgs?.size())
+ .isEqualTo(0)
+ }
+
+ @Test
+ fun matchDotStar() {
+ val destination = NoOpNavigator().createDestination()
+
+ destination.addDeepLink("www.example.com/.*")
+ destination.addDeepLink("www.example.com/{name}")
+
+ val match = destination.matchDeepLink(Uri.parse("https://www.example.com/foo"))
+ assertWithMessage("Deep link should match")
+ .that(match)
+ .isNotNull()
+ assertWithMessage("Deep link should pick name over .*")
+ .that(match?.matchingArgs?.size())
+ .isEqualTo(1)
+ }
+
+ @Test
fun matchDeepLinkBestMatch() {
val destination = NoOpNavigator().createDestination()
@@ -69,13 +108,13 @@
.that(match)
.isNotNull()
assertWithMessage("Deep link should pick the argument with more matching arguments")
- .that(match?.second?.size())
+ .that(match?.matchingArgs?.size())
.isEqualTo(2)
assertWithMessage("Deep link should extract id argument correctly")
- .that(match?.second?.getInt("id"))
+ .that(match?.matchingArgs?.getInt("id"))
.isEqualTo(43)
assertWithMessage("Deep link should extract postId argument correctly")
- .that(match?.second?.getInt("postId"))
+ .that(match?.matchingArgs?.getInt("postId"))
.isEqualTo(99)
}
diff --git a/navigation/common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt b/navigation/common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
index 46496ab..50f3902 100644
--- a/navigation/common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
+++ b/navigation/common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
@@ -45,11 +45,58 @@
.isNotNull()
assertWithMessage("Deep link should extract id argument correctly")
- .that(match?.second?.getInt("id"))
+ .that(match?.matchingArgs?.getInt("id"))
.isEqualTo(43)
}
@Test
+ fun matchDeepLinkBestMatchExact() {
+ val navigatorProvider = NavigatorProvider().apply {
+ addNavigator(NavGraphNavigator(this))
+ }
+ val graph = navigatorProvider.getNavigator(NavGraphNavigator::class.java)
+ .createDestination()
+
+ graph.addDeepLink("www.example.com/users/index.html")
+
+ val idArgument = NavArgument.Builder()
+ .setType(NavType.StringType)
+ .build()
+ graph.addArgument("id", idArgument)
+ graph.addDeepLink("www.example.com/users/{name}")
+
+ val match = graph.matchDeepLink(
+ Uri.parse("https://www.example.com/users/index.html"))
+
+ assertWithMessage("Deep link should match")
+ .that(match)
+ .isNotNull()
+ assertWithMessage("Deep link should pick the exact match")
+ .that(match?.matchingArgs?.size())
+ .isEqualTo(0)
+ }
+
+ @Test
+ fun matchDotStar() {
+ val navigatorProvider = NavigatorProvider().apply {
+ addNavigator(NavGraphNavigator(this))
+ }
+ val graph = navigatorProvider.getNavigator(NavGraphNavigator::class.java)
+ .createDestination()
+
+ graph.addDeepLink("www.example.com/.*")
+ graph.addDeepLink("www.example.com/{name}")
+
+ val match = graph.matchDeepLink(Uri.parse("https://www.example.com/foo"))
+ assertWithMessage("Deep link should match")
+ .that(match)
+ .isNotNull()
+ assertWithMessage("Deep link should pick name over .*")
+ .that(match?.matchingArgs?.size())
+ .isEqualTo(1)
+ }
+
+ @Test
fun matchDeepLinkBestMatch() {
val navigatorProvider = NavigatorProvider().apply {
addNavigator(NavGraphNavigator(this))
@@ -77,13 +124,13 @@
.isNotNull()
assertWithMessage("Deep link should pick the argument with more matching arguments")
- .that(match?.second?.size())
+ .that(match?.matchingArgs?.size())
.isEqualTo(2)
assertWithMessage("Deep link should extract id argument correctly")
- .that(match?.second?.getInt("id"))
+ .that(match?.matchingArgs?.getInt("id"))
.isEqualTo(43)
assertWithMessage("Deep link should extract postId argument correctly")
- .that(match?.second?.getInt("postId"))
+ .that(match?.matchingArgs?.getInt("postId"))
.isEqualTo(99)
}
@@ -125,13 +172,13 @@
.isNotNull()
assertWithMessage("Deep link should point to correct destination")
- .that(match?.first)
+ .that(match?.destination)
.isSameAs(postDestination)
assertWithMessage("Deep link should extract id argument correctly")
- .that(match?.second?.getInt("id"))
+ .that(match?.matchingArgs?.getInt("id"))
.isEqualTo(43)
assertWithMessage("Deep link should extract postId argument correctly")
- .that(match?.second?.getInt("postId"))
+ .that(match?.matchingArgs?.getInt("postId"))
.isEqualTo(99)
}
}
diff --git a/navigation/common/src/main/java/androidx/navigation/NavDeepLink.java b/navigation/common/src/main/java/androidx/navigation/NavDeepLink.java
index 33908be..6d59cc5 100644
--- a/navigation/common/src/main/java/androidx/navigation/NavDeepLink.java
+++ b/navigation/common/src/main/java/androidx/navigation/NavDeepLink.java
@@ -34,6 +34,7 @@
private final ArrayList<String> mArguments = new ArrayList<>();
private final Pattern mPattern;
+ private final boolean mExactDeepLink;
/**
* NavDestinations should be created via {@link Navigator#createDestination}.
@@ -47,6 +48,8 @@
Pattern fillInPattern = Pattern.compile("\\{(.+?)\\}");
Matcher matcher = fillInPattern.matcher(uri);
int appendPos = 0;
+ // Track whether this is an exact deep link
+ boolean exactDeepLink = !uri.contains(".*");
while (matcher.find()) {
String argName = matcher.group(1);
mArguments.add(argName);
@@ -54,6 +57,7 @@
uriRegex.append(Pattern.quote(uri.substring(appendPos, matcher.start())));
uriRegex.append("(.+?)");
appendPos = matcher.end();
+ exactDeepLink = false;
}
if (appendPos < uri.length()) {
// Use Pattern.quote() to treat the input string as a literal
@@ -64,12 +68,17 @@
// they are still treated as wildcards in our final regex
String finalRegex = uriRegex.toString().replace(".*", "\\E.*\\Q");
mPattern = Pattern.compile(finalRegex);
+ mExactDeepLink = exactDeepLink;
}
boolean matches(@NonNull Uri deepLink) {
return mPattern.matcher(deepLink.toString()).matches();
}
+ boolean isExactDeepLink() {
+ return mExactDeepLink;
+ }
+
@Nullable
Bundle getMatchingArguments(@NonNull Uri deepLink,
@NonNull Map<String, NavArgument> arguments) {
diff --git a/navigation/common/src/main/java/androidx/navigation/NavDestination.java b/navigation/common/src/main/java/androidx/navigation/NavDestination.java
index f032f29d..ff0a27d 100644
--- a/navigation/common/src/main/java/androidx/navigation/NavDestination.java
+++ b/navigation/common/src/main/java/androidx/navigation/NavDestination.java
@@ -29,7 +29,6 @@
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v4.util.Pair;
import android.support.v4.util.SparseArrayCompat;
import android.util.AttributeSet;
@@ -72,6 +71,43 @@
Class value();
}
+ static class DeepLinkMatch implements Comparable<DeepLinkMatch> {
+ @NonNull
+ private final NavDestination mDestination;
+ @NonNull
+ private final Bundle mMatchingArgs;
+ private final boolean mIsExactDeepLink;
+
+ DeepLinkMatch(@NonNull NavDestination destination, @NonNull Bundle matchingArgs,
+ boolean isExactDeepLink) {
+ mDestination = destination;
+ mMatchingArgs = matchingArgs;
+ mIsExactDeepLink = isExactDeepLink;
+ }
+
+ @NonNull
+ NavDestination getDestination() {
+ return mDestination;
+ }
+
+ @NonNull
+ Bundle getMatchingArgs() {
+ return mMatchingArgs;
+ }
+
+ @Override
+ public int compareTo(DeepLinkMatch other) {
+ // Prefer exact deep links
+ if (mIsExactDeepLink && !other.mIsExactDeepLink) {
+ return 1;
+ } else if (!mIsExactDeepLink && other.mIsExactDeepLink) {
+ return -1;
+ }
+ // Prefer matches with more matching arguments
+ return mMatchingArgs.size() - other.mMatchingArgs.size();
+ }
+ }
+
private static final HashMap<String, Class> sClasses = new HashMap<>();
/**
@@ -300,19 +336,22 @@
* extracted from the Uri, or null if no match was found.
*/
@Nullable
- Pair<NavDestination, Bundle> matchDeepLink(@NonNull Uri uri) {
+ DeepLinkMatch matchDeepLink(@NonNull Uri uri) {
if (mDeepLinks == null) {
return null;
}
- Bundle bestMatchingArguments = null;
+ DeepLinkMatch bestMatch = null;
for (NavDeepLink deepLink : mDeepLinks) {
Bundle matchingArguments = deepLink.getMatchingArguments(uri, getArguments());
- if (matchingArguments != null && (bestMatchingArguments == null
- || matchingArguments.size() > bestMatchingArguments.size())) {
- bestMatchingArguments = matchingArguments;
+ if (matchingArguments != null) {
+ DeepLinkMatch newMatch = new DeepLinkMatch(this, matchingArguments,
+ deepLink.isExactDeepLink());
+ if (bestMatch == null || newMatch.compareTo(bestMatch) > 0) {
+ bestMatch = newMatch;
+ }
}
}
- return bestMatchingArguments != null ? new Pair<>(this, bestMatchingArguments) : null;
+ return bestMatch;
}
/**
diff --git a/navigation/common/src/main/java/androidx/navigation/NavGraph.java b/navigation/common/src/main/java/androidx/navigation/NavGraph.java
index 39375e2..20d73af 100644
--- a/navigation/common/src/main/java/androidx/navigation/NavGraph.java
+++ b/navigation/common/src/main/java/androidx/navigation/NavGraph.java
@@ -19,11 +19,9 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.net.Uri;
-import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.support.v4.util.Pair;
import android.support.v4.util.SparseArrayCompat;
import android.util.AttributeSet;
@@ -73,14 +71,14 @@
@Override
@Nullable
- Pair<NavDestination, Bundle> matchDeepLink(@NonNull Uri uri) {
+ DeepLinkMatch matchDeepLink(@NonNull Uri uri) {
// First search through any deep links directly added to this NavGraph
- Pair<NavDestination, Bundle> bestMatch = super.matchDeepLink(uri);
+ DeepLinkMatch bestMatch = super.matchDeepLink(uri);
// Then search through all child destinations for a matching deep link
for (NavDestination child : this) {
- Pair<NavDestination, Bundle> childBestMatch = child.matchDeepLink(uri);
+ DeepLinkMatch childBestMatch = child.matchDeepLink(uri);
if (childBestMatch != null && (bestMatch == null
- || childBestMatch.second.size() > bestMatch.second.size())) {
+ || childBestMatch.compareTo(bestMatch) > 0)) {
bestMatch = childBestMatch;
}
}
diff --git a/navigation/fragment/api/1.0.0-beta02.txt b/navigation/fragment/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..8759a64
--- /dev/null
+++ b/navigation/fragment/api/1.0.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+ @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+ ctor public FragmentNavigator(android.content.Context, android.support.v4.app.FragmentManager, int);
+ method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+ method public android.support.v4.app.Fragment instantiateFragment(android.content.Context, android.support.v4.app.FragmentManager, String, android.os.Bundle?);
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+ ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+ method public final String getClassName();
+ method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+ }
+
+ public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+ method public java.util.Map<android.view.View,java.lang.String> getSharedElements();
+ }
+
+ public static final class FragmentNavigator.Extras.Builder {
+ ctor public FragmentNavigator.Extras.Builder();
+ method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+ method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View,java.lang.String>);
+ method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+ }
+
+ public class NavHostFragment extends android.support.v4.app.Fragment implements androidx.navigation.NavHost {
+ ctor public NavHostFragment();
+ method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+ method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+ method protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+ method public static androidx.navigation.NavController findNavController(android.support.v4.app.Fragment);
+ method public final androidx.navigation.NavController getNavController();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/fragment/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/fragment/api/res-1.0.0-beta02.txt
diff --git a/navigation/fragment/ktx/api/1.0.0-beta02.txt b/navigation/fragment/ktx/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..0e75320
--- /dev/null
+++ b/navigation/fragment/ktx/api/1.0.0-beta02.txt
@@ -0,0 +1,31 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+ public final class FragmentKt {
+ ctor public FragmentKt();
+ method public static androidx.navigation.NavController findNavController(android.support.v4.app.Fragment);
+ }
+
+ public final class FragmentNavArgsLazyKt {
+ ctor public FragmentNavArgsLazyKt();
+ method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(android.support.v4.app.Fragment);
+ }
+
+ public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+ ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends android.support.v4.app.Fragment> fragmentClass);
+ method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+ }
+
+ public final class FragmentNavigatorDestinationBuilderKt {
+ ctor public FragmentNavigatorDestinationBuilderKt();
+ method public static inline <reified F extends android.support.v4.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+ method public static inline <reified F extends android.support.v4.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit>! builder);
+ }
+
+ public final class FragmentNavigatorExtrasKt {
+ ctor public FragmentNavigatorExtrasKt();
+ method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/fragment/ktx/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/fragment/ktx/api/res-1.0.0-beta02.txt
diff --git a/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt b/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
index 2c162df..87e2410 100644
--- a/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
+++ b/navigation/fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
@@ -31,7 +31,6 @@
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import org.junit.Assert.assertEquals
-import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
@@ -222,34 +221,61 @@
@Test
fun testSingleTop() {
val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
+ val backPressListener = mock(Navigator.OnNavigatorBackPressListener::class.java)
+ fragmentNavigator.addOnNavigatorBackPressListener(backPressListener)
val destination = fragmentNavigator.createDestination()
destination.className = EmptyFragment::class.java.name
// First push an initial Fragment
assertThat(fragmentNavigator.navigate(destination, null, null, null))
.isEqualTo(destination)
+ fragmentManager.executePendingTransactions()
+ val initialFragment = fragmentManager.findFragmentById(R.id.container)
+ assertWithMessage("Initial Fragment should be added")
+ .that(initialFragment)
+ .isNotNull()
// Now push the Fragment that we want to replace with a singleTop operation
+ destination.id = 1
assertThat(fragmentNavigator.navigate(destination, null, null, null))
.isEqualTo(destination)
fragmentManager.executePendingTransactions()
val fragment = fragmentManager.findFragmentById(R.id.container)
- assertNotNull("Fragment should be added", fragment)
+ assertWithMessage("Fragment should be added")
+ .that(fragment)
+ .isNotNull()
assertThat(fragmentNavigator.navigate(destination, null,
NavOptions.Builder().setLaunchSingleTop(true).build(), null))
.isNull()
fragmentManager.executePendingTransactions()
val replacementFragment = fragmentManager.findFragmentById(R.id.container)
- assertNotNull("Replacement Fragment should be added", replacementFragment)
- assertTrue("Replacement Fragment should be the correct type",
- replacementFragment is EmptyFragment)
- assertEquals("Replacement Fragment should be the primary navigation Fragment",
- replacementFragment, fragmentManager.primaryNavigationFragment)
- assertNotEquals("Replacement should be a new instance", fragment,
- replacementFragment)
- assertEquals("Old instance should be destroyed", Lifecycle.State.DESTROYED,
- fragment!!.lifecycle.currentState)
+ assertWithMessage("Replacement Fragment should be added")
+ .that(replacementFragment)
+ .isNotNull()
+ assertWithMessage("Replacement Fragment should be the correct type")
+ .that(replacementFragment)
+ .isInstanceOf(EmptyFragment::class.java)
+ assertWithMessage("Replacement Fragment should be the primary navigation Fragment")
+ .that(fragmentManager.primaryNavigationFragment)
+ .isSameAs(replacementFragment)
+ assertWithMessage("Replacement should be a new instance")
+ .that(replacementFragment)
+ .isNotSameAs(fragment)
+ assertWithMessage("Old instance should be destroyed")
+ .that(fragment!!.lifecycle.currentState)
+ .isEqualTo(Lifecycle.State.DESTROYED)
+
+ assertThat(fragmentNavigator.popBackStack())
+ .isTrue()
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Initial Fragment should be on top of back stack after pop")
+ .that(fragmentManager.findFragmentById(R.id.container))
+ .isSameAs(initialFragment)
+ // TODO enable after fixing b/124332597 and moving to depend on AndroidX
+ /*assertWithMessage("Initial Fragment should be the primary navigation Fragment")
+ .that(fragmentManager.primaryNavigationFragment)
+ .isSameAs(initialFragment)*/
}
@UiThreadTest
@@ -267,8 +293,10 @@
// Now pop the initial Fragment
val popped = fragmentNavigator.popBackStack()
- assertFalse("FragmentNavigator should return false when popping the initial Fragment",
- popped)
+ assertWithMessage("FragmentNavigator should return false when popping " +
+ "the initial Fragment")
+ .that(popped)
+ .isTrue()
}
@UiThreadTest
diff --git a/navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java b/navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
index b684a71..4aff155 100644
--- a/navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
+++ b/navigation/fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.java
@@ -149,16 +149,14 @@
+ " saved its state");
return false;
}
- boolean popped = false;
if (mFragmentManager.getBackStackEntryCount() > 0) {
mFragmentManager.popBackStack(
generateBackStackName(mBackStack.size(), mBackStack.peekLast()),
FragmentManager.POP_BACK_STACK_INCLUSIVE);
mIsPendingBackStackOperation = true;
- popped = true;
- }
+ } // else, we're on the first Fragment, so there's nothing to pop from FragmentManager
mBackStack.removeLast();
- return popped;
+ return true;
}
@NonNull
@@ -248,8 +246,10 @@
// back stack, a simple replace() isn't enough so we
// remove it from the back stack and put our replacement
// on the back stack in its place
- mFragmentManager.popBackStack();
- ft.addToBackStack(generateBackStackName(mBackStack.size() + 1, destId));
+ mFragmentManager.popBackStack(
+ generateBackStackName(mBackStack.size(), mBackStack.peekLast()),
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ ft.addToBackStack(generateBackStackName(mBackStack.size(), destId));
mIsPendingBackStackOperation = true;
}
isAdded = false;
diff --git a/navigation/runtime/api/1.0.0-beta02.txt b/navigation/runtime/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..0073e0d
--- /dev/null
+++ b/navigation/runtime/api/1.0.0-beta02.txt
@@ -0,0 +1,102 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+ ctor public ActivityNavigator(android.content.Context);
+ method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+ method public androidx.navigation.ActivityNavigator.Destination createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+ ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+ method public final String? getAction();
+ method public final android.content.ComponentName? getComponent();
+ method public final android.net.Uri? getData();
+ method public final String? getDataPattern();
+ method public final android.content.Intent? getIntent();
+ method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+ method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+ method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+ method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+ method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+ }
+
+ public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+ method public android.support.v4.app.ActivityOptionsCompat? getActivityOptions();
+ method public int getFlags();
+ }
+
+ public static final class ActivityNavigator.Extras.Builder {
+ ctor public ActivityNavigator.Extras.Builder();
+ method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+ method public androidx.navigation.ActivityNavigator.Extras build();
+ method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(android.support.v4.app.ActivityOptionsCompat);
+ }
+
+ public class NavController {
+ ctor public NavController(android.content.Context);
+ method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+ method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+ method public androidx.navigation.NavDestination? getCurrentDestination();
+ method public androidx.navigation.NavGraph getGraph();
+ method public androidx.navigation.NavInflater getNavInflater();
+ method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+ method public boolean handleDeepLink(android.content.Intent?);
+ method public void navigate(@IdRes int);
+ method public void navigate(@IdRes int, android.os.Bundle?);
+ method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+ method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void navigate(androidx.navigation.NavDirections);
+ method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+ method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+ method public boolean navigateUp();
+ method public boolean popBackStack();
+ method public boolean popBackStack(@IdRes int, boolean);
+ method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+ method @CallSuper public void restoreState(android.os.Bundle?);
+ method @CallSuper public android.os.Bundle? saveState();
+ method @CallSuper public void setGraph(@NavigationRes int);
+ method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+ method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+ method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+ field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+ }
+
+ public static interface NavController.OnDestinationChangedListener {
+ method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+ }
+
+ public final class NavDeepLinkBuilder {
+ ctor public NavDeepLinkBuilder(android.content.Context);
+ method public android.app.PendingIntent createPendingIntent();
+ method public android.support.v4.app.TaskStackBuilder createTaskStackBuilder();
+ method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+ method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+ method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+ method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+ method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+ method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+ }
+
+ public interface NavHost {
+ method public androidx.navigation.NavController getNavController();
+ }
+
+ public final class NavInflater {
+ ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+ method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+ }
+
+ public final class Navigation {
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+ method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+ method public static androidx.navigation.NavController findNavController(android.view.View);
+ method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/runtime/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/runtime/api/res-1.0.0-beta02.txt
diff --git a/navigation/runtime/ktx/api/1.0.0-beta02.txt b/navigation/runtime/ktx/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..d1e3b0e
--- /dev/null
+++ b/navigation/runtime/ktx/api/1.0.0-beta02.txt
@@ -0,0 +1,57 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class ActivityKt {
+ ctor public ActivityKt();
+ method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+ }
+
+ public final class ActivityNavArgsLazyKt {
+ ctor public ActivityNavArgsLazyKt();
+ method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(android.app.Activity);
+ }
+
+ public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+ ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+ method public androidx.navigation.ActivityNavigator.Destination build();
+ method public String? getAction();
+ method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+ method public android.net.Uri? getData();
+ method public String? getDataPattern();
+ method public void setAction(String? p);
+ method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+ method public void setData(android.net.Uri? p);
+ method public void setDataPattern(String? p);
+ property public final String? action;
+ property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+ property public final android.net.Uri? data;
+ property public final String? dataPattern;
+ }
+
+ public final class ActivityNavigatorDestinationBuilderKt {
+ ctor public ActivityNavigatorDestinationBuilderKt();
+ method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class ActivityNavigatorExtrasKt {
+ ctor public ActivityNavigatorExtrasKt();
+ method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(android.support.v4.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+ }
+
+ public final class NavControllerKt {
+ ctor public NavControllerKt();
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class NavHostKt {
+ ctor public NavHostKt();
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class ViewKt {
+ ctor public ViewKt();
+ method public static androidx.navigation.NavController findNavController(android.view.View);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/runtime/ktx/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/runtime/ktx/api/res-1.0.0-beta02.txt
diff --git a/navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt b/navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
index 4fc0384..8aa18ad 100644
--- a/navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
+++ b/navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.os.Bundle
import android.os.Parcel
+import android.os.Parcelable
import androidx.navigation.test.R
import androidx.navigation.testing.TestNavigator
import androidx.navigation.testing.test
@@ -208,7 +209,7 @@
val navigator = TestNavigator()
navController.navigatorProvider.addNavigator(navigator)
val graph = NavInflater(context, navController.navigatorProvider)
- .inflate(R.navigation.nav_simple)
+ .inflate(R.navigation.nav_simple)
navController.graph = graph
navController.navigate(R.id.second_test)
@@ -227,6 +228,66 @@
}
@Test
+ fun testSaveRestoreStateBundleParceled() {
+ val context = ApplicationProvider.getApplicationContext() as Context
+ var navController = NavController(context)
+ val navigator = SaveStateTestNavigator()
+ navController.navigatorProvider.addNavigator(navigator)
+ navController.setGraph(R.navigation.nav_simple)
+
+ navigator.customParcel = CustomTestParcelable(TEST_ARG_VALUE)
+
+ val savedState = navController.saveState()
+
+ val parcel = Parcel.obtain()
+ savedState?.writeToParcel(parcel, 0)
+ parcel.setDataPosition(0)
+
+ val restoredState = Bundle.CREATOR.createFromParcel(parcel)
+
+ navController = NavController(context)
+ navController.navigatorProvider.addNavigator(navigator)
+
+ navController.restoreState(restoredState)
+ navController.setGraph(R.navigation.nav_simple)
+
+ // Ensure custom parcelable is present and can be read
+ assertThat(navigator.customParcel?.name).isEqualTo(TEST_ARG_VALUE)
+ }
+
+ @Test
+ fun testBackstackArgsBundleParceled() {
+ val context = ApplicationProvider.getApplicationContext() as Context
+ var navController = NavController(context)
+ val navigator = SaveStateTestNavigator()
+ navController.navigatorProvider.addNavigator(navigator)
+
+ val backStackArg1 = Bundle()
+ backStackArg1.putParcelable(TEST_ARG, CustomTestParcelable(TEST_ARG_VALUE))
+ navController.setGraph(R.navigation.nav_arguments)
+ navController.navigate(R.id.second_test, backStackArg1)
+
+ val savedState = navController.saveState()
+
+ val parcel = Parcel.obtain()
+ savedState?.writeToParcel(parcel, 0)
+ parcel.setDataPosition(0)
+
+ val restoredState = Bundle.CREATOR.createFromParcel(parcel)
+
+ navController = NavController(context)
+ navController.navigatorProvider.addNavigator(navigator)
+
+ navController.restoreState(restoredState)
+ navController.setGraph(R.navigation.nav_arguments)
+
+ navController.addOnDestinationChangedListener { _, _, arguments ->
+ assertThat(arguments?.getParcelable<CustomTestParcelable>(TEST_ARG)?.name)
+ .isEqualTo(TEST_ARG_VALUE)
+ }
+ }
+
+ @Test
fun testNavigateWithNoDefaultValue() {
val returnedArgs = navigateWithArgs(null)
@@ -285,9 +346,9 @@
assertEquals(1, navigator.backStack.size)
val success = navController.popBackStack()
- assertWithMessage("NavController should return true when popping the root")
+ assertWithMessage("NavController should return false when popping the root")
.that(success)
- .isTrue()
+ .isFalse()
assertNull(navController.currentDestination)
assertEquals(0, navigator.backStack.size)
}
@@ -301,14 +362,17 @@
assertEquals(1, navigator.backStack.size)
val success = navController.popBackStack()
- assertWithMessage("NavController should return true when popping the root")
+ assertWithMessage("NavController should return false when popping the root")
.that(success)
- .isTrue()
+ .isFalse()
assertNull(navController.currentDestination)
assertEquals(0, navigator.backStack.size)
val popped = navController.popBackStack()
- assertFalse(popped)
+ assertWithMessage("popBackStack should return false when there's nothing on the " +
+ "back stack")
+ .that(popped)
+ .isFalse()
}
@Test
@@ -323,7 +387,10 @@
assertEquals(R.id.second_test, navController.currentDestination?.id ?: 0)
assertEquals(2, navigator.backStack.size)
- navController.popBackStack()
+ val popped = navController.popBackStack()
+ assertWithMessage("NavController should return true when popping a non-root destination")
+ .that(popped)
+ .isTrue()
assertEquals(R.id.start_test, navController.currentDestination?.id ?: 0)
assertEquals(1, navigator.backStack.size)
}
@@ -341,7 +408,9 @@
assertEquals(2, navigator.backStack.size)
val popped = navController.popBackStack(UNKNOWN_DESTINATION_ID, false)
- assertFalse(popped)
+ assertWithMessage("Popping to an invalid destination should return false")
+ .that(popped)
+ .isFalse()
assertEquals(R.id.second_test, navController.currentDestination?.id ?: 0)
assertEquals(2, navigator.backStack.size)
}
@@ -420,7 +489,9 @@
assertEquals(2, navigator.backStack.size)
// This should function identically to popBackStack()
- navController.navigateUp()
+ val success = navController.navigateUp()
+ assertThat(success)
+ .isTrue()
assertEquals(R.id.start_test, navController.currentDestination?.id ?: 0)
assertEquals(1, navigator.backStack.size)
}
@@ -648,18 +719,41 @@
companion object {
private const val STATE_SAVED_COUNT = "saved_count"
+ private const val TEST_PARCEL = "test_parcel"
}
var saveStateCount = 0
+ var customParcel: CustomTestParcelable? = null
override fun onSaveState(): Bundle? {
saveStateCount += 1
val state = Bundle()
state.putInt(STATE_SAVED_COUNT, saveStateCount)
+ state.putParcelable(TEST_PARCEL, customParcel)
return state
}
override fun onRestoreState(savedState: Bundle) {
saveStateCount = savedState.getInt(STATE_SAVED_COUNT)
+ customParcel = savedState.getParcelable(TEST_PARCEL)
}
}
+
+/**
+ * [CustomTestParcelable] that helps testing bundled custom parcels
+ */
+data class CustomTestParcelable(val name: String?) : Parcelable {
+ constructor(parcel: Parcel) : this(parcel.readString())
+
+ override fun writeToParcel(dest: Parcel?, flags: Int) {
+ dest?.writeString(name)
+ }
+
+ override fun describeContents() = 0
+
+ companion object CREATOR : Parcelable.Creator<CustomTestParcelable> {
+ override fun createFromParcel(parcel: Parcel) = CustomTestParcelable(parcel)
+
+ override fun newArray(size: Int): Array<CustomTestParcelable?> = arrayOfNulls(size)
+ }
+}
\ No newline at end of file
diff --git a/navigation/runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt b/navigation/runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt
index da8eed3..b950630 100644
--- a/navigation/runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt
+++ b/navigation/runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt
@@ -78,9 +78,9 @@
val result = graph.matchDeepLink(expectedUri)
assertThat(result)
.isNotNull()
- assertThat(result?.first)
+ assertThat(result?.destination)
.isNotNull()
- assertThat(result?.first?.id).isEqualTo(R.id.second_test)
+ assertThat(result?.destination?.id).isEqualTo(R.id.second_test)
}
@Test
@@ -168,6 +168,8 @@
.isEqualTo(NavType.ReferenceType to R.bool.test_bool_arg)
assertThat(defaultArguments["test_reference_color"]?.run { type to defaultValue })
.isEqualTo(NavType.ReferenceType to R.color.test_color_arg)
+ assertThat(defaultArguments["test_reference_zero_default"]?.run { type to defaultValue })
+ .isEqualTo(NavType.ReferenceType to 0)
}
@Test
diff --git a/navigation/runtime/src/androidTest/res/navigation/nav_default_arguments.xml b/navigation/runtime/src/androidTest/res/navigation/nav_default_arguments.xml
index f8b77de..9799c0f 100644
--- a/navigation/runtime/src/androidTest/res/navigation/nav_default_arguments.xml
+++ b/navigation/runtime/src/androidTest/res/navigation/nav_default_arguments.xml
@@ -45,6 +45,10 @@
<argument
android:name="test_reference_color"
android:defaultValue="@color/test_color_arg" />
+ <argument
+ android:name="test_reference_zero_default"
+ app:argType="reference"
+ android:defaultValue="0" />
<argument
android:name="test_boolean"
diff --git a/navigation/runtime/src/main/java/androidx/navigation/NavController.java b/navigation/runtime/src/main/java/androidx/navigation/NavController.java
index 0134462..6fd84d3 100644
--- a/navigation/runtime/src/main/java/androidx/navigation/NavController.java
+++ b/navigation/runtime/src/main/java/androidx/navigation/NavController.java
@@ -28,7 +28,6 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.TaskStackBuilder;
-import android.support.v4.util.Pair;
import android.util.Log;
import java.util.ArrayDeque;
@@ -237,7 +236,8 @@
* the system {@link android.view.KeyEvent#KEYCODE_BACK Back} button when the associated
* navigation host has focus.
*
- * @return true if the stack was popped, false otherwise
+ * @return true if the stack was popped and the user has been navigated to another
+ * destination, false otherwise
*/
public boolean popBackStack() {
if (mBackStack.isEmpty()) {
@@ -254,14 +254,14 @@
* @param destinationId The topmost destination to retain
* @param inclusive Whether the given destination should also be popped.
*
- * @return true if the stack was popped at least once, false otherwise
+ * @return true if the stack was popped at least once and the user has been navigated to
+ * another destination, false otherwise
*/
public boolean popBackStack(@IdRes int destinationId, boolean inclusive) {
boolean popped = popBackStackInternal(destinationId, inclusive);
- if (popped) {
- dispatchOnDestinationChanged();
- }
- return popped;
+ // Only return true if the pop succeeded and we've dispatched
+ // the change to a new destination
+ return popped && dispatchOnDestinationChanged();
}
/**
@@ -302,13 +302,13 @@
+ " as it was not found on the current back stack");
return false;
}
- boolean popped = true;
+ boolean popped = false;
for (Navigator navigator : popOperations) {
if (navigator.popBackStack()) {
mBackStack.removeLast();
+ popped = true;
} else {
// The pop did not complete successfully, so stop immediately
- popped = false;
break;
}
}
@@ -357,8 +357,15 @@
}
}
+ /**
+ * Dispatch changes to all OnDestinationChangedListeners.
+ * <p>
+ * If the back stack is empty, no events get dispatched.
+ *
+ * @return If changes were dispatched.
+ */
@SuppressWarnings("WeakerAccess") /* synthetic access */
- void dispatchOnDestinationChanged() {
+ boolean dispatchOnDestinationChanged() {
// We never want to leave NavGraphs on the top of the stack
//noinspection StatementWithEmptyBody
while (!mBackStack.isEmpty()
@@ -373,7 +380,9 @@
listener.onDestinationChanged(this, backStackEntry.getDestination(),
backStackEntry.getArguments());
}
+ return true;
}
+ return false;
}
/**
@@ -482,6 +491,9 @@
throw new IllegalStateException("unknown destination during restore: "
+ mContext.getResources().getResourceName(destinationId));
}
+ if (args != null) {
+ args.setClassLoader(mContext.getClassLoader());
+ }
mBackStack.add(new NavBackStackEntry(node, args));
}
mBackStackIdsToRestore = null;
@@ -529,10 +541,10 @@
bundle.putAll(deepLinkExtras);
}
if ((deepLink == null || deepLink.length == 0) && intent.getData() != null) {
- Pair<NavDestination, Bundle> matchingDeepLink = mGraph.matchDeepLink(intent.getData());
+ NavDestination.DeepLinkMatch matchingDeepLink = mGraph.matchDeepLink(intent.getData());
if (matchingDeepLink != null) {
- deepLink = matchingDeepLink.first.buildDeepLinkIds();
- bundle.putAll(matchingDeepLink.second);
+ deepLink = matchingDeepLink.getDestination().buildDeepLinkIds();
+ bundle.putAll(matchingDeepLink.getMatchingArgs());
}
}
if (deepLink == null || deepLink.length == 0) {
@@ -929,6 +941,8 @@
return;
}
+ navState.setClassLoader(mContext.getClassLoader());
+
mNavigatorStateToRestore = navState.getBundle(KEY_NAVIGATOR_STATE);
mBackStackIdsToRestore = navState.getIntArray(KEY_BACK_STACK_IDS);
mBackStackArgsToRestore = navState.getParcelableArray(KEY_BACK_STACK_ARGS);
diff --git a/navigation/runtime/src/main/java/androidx/navigation/NavInflater.java b/navigation/runtime/src/main/java/androidx/navigation/NavInflater.java
index 96c787a..5b7c8f0 100644
--- a/navigation/runtime/src/main/java/androidx/navigation/NavInflater.java
+++ b/navigation/runtime/src/main/java/androidx/navigation/NavInflater.java
@@ -185,6 +185,9 @@
if (navType == NavType.ReferenceType) {
if (value.resourceId != 0) {
defaultValue = value.resourceId;
+ } else if (value.type == TypedValue.TYPE_FIRST_INT && value.data == 0) {
+ // Support "0" as a default value for reference types
+ defaultValue = 0;
} else {
throw new XmlPullParserException(
"unsupported value '" + value.string
@@ -223,11 +226,6 @@
argType, "float");
defaultValue = value.getFloat();
break;
- case TypedValue.TYPE_REFERENCE:
- navType = checkNavType(value, navType, NavType.IntType,
- argType, "reference");
- defaultValue = value.data;
- break;
case TypedValue.TYPE_INT_BOOLEAN:
navType = checkNavType(value, navType, NavType.BoolType,
argType, "boolean");
diff --git a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParser.kt b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParser.kt
index 5c60ac1..d92260d 100644
--- a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParser.kt
+++ b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParser.kt
@@ -163,8 +163,18 @@
LongType -> parseLongValue(defaultValue)
FloatType -> parseFloatValue(defaultValue)
BoolType -> parseBoolean(defaultValue)
- ReferenceType -> parseReference(defaultValue, rFilePackage)?.let {
- ReferenceValue(it)
+ ReferenceType -> {
+ when (defaultValue) {
+ VALUE_NULL -> {
+ context.logger.error(NavParserErrors.nullDefaultValueReference(name),
+ xmlPosition)
+ return context.createStubArg()
+ }
+ "0" -> IntValue("0")
+ else -> parseReference(defaultValue, rFilePackage)?.let {
+ ReferenceValue(it)
+ }
+ }
}
StringType -> {
if (defaultValue == VALUE_NULL) {
diff --git a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParserErrors.kt b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParserErrors.kt
index 37c2833..a800a42 100644
--- a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParserErrors.kt
+++ b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/NavParserErrors.kt
@@ -26,6 +26,9 @@
fun invalidDefaultValueReference(value: String) = "Failed to parse defaultValue " +
"'$value' as reference. Reference must be in format @[+][package:]res_type/resource_name"
+ fun nullDefaultValueReference(name: String?) = "android:defaultValue is @null, but '$name' " +
+ "is of type \"reference\". Use \"0\" to signify a empty reference id"
+
fun invalidDefaultValue(value: String, type: NavType) = "Failed to parse defaultValue " +
"'$value' as $type"
diff --git a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/java/JavaTypes.kt b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/java/JavaTypes.kt
index 2bde474..2c844d1 100644
--- a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/java/JavaTypes.kt
+++ b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/java/JavaTypes.kt
@@ -58,6 +58,7 @@
internal val BUNDLE_CLASSNAME: ClassName = ClassName.get("android.os", "Bundle")
internal val PARCELABLE_CLASSNAME = ClassName.get("android.os", "Parcelable")
internal val SERIALIZABLE_CLASSNAME = ClassName.get("java.io", "Serializable")
+internal val SYSTEM_CLASSNAME = ClassName.get("java.lang", "System")
internal abstract class Annotations {
abstract val NULLABLE_CLASSNAME: ClassName
@@ -108,10 +109,22 @@
)
}.endControlFlow()
}
- is ObjectArrayType -> builder.addStatement(
- "$N = ($T) $N.$N($S)",
- lValue, typeName(), bundle, bundleGetMethod(), arg.name
- )
+ is ObjectArrayType -> builder.apply {
+ val arrayName = "__array"
+ val baseType = (arg.type.typeName() as ArrayTypeName).componentType
+ addStatement("$T[] $N = $N.$N($S)",
+ PARCELABLE_CLASSNAME, arrayName, bundle, bundleGetMethod(), arg.name)
+ beginControlFlow("if ($N != null)", arrayName).apply {
+ addStatement("$N = new $T[$N.length]", lValue, baseType, arrayName)
+ addStatement("$T.arraycopy($N, 0, $N, 0, $N.length)",
+ SYSTEM_CLASSNAME, arrayName, lValue, arrayName
+ )
+ }
+ nextControlFlow("else").apply {
+ addStatement("$N = null", lValue)
+ }
+ endControlFlow()
+ }
else -> builder.addStatement(
"$N = $N.$N($S)",
lValue,
diff --git a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinTypes.kt b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinTypes.kt
index 35376d9..4baae90 100644
--- a/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinTypes.kt
+++ b/navigation/safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinTypes.kt
@@ -51,6 +51,7 @@
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.INT
import com.squareup.kotlinpoet.LONG
+import com.squareup.kotlinpoet.ParameterizedTypeName
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.asTypeName
@@ -91,10 +92,12 @@
)
endControlFlow()
}
- is ObjectArrayType -> builder.addStatement(
- "%L = %L.%L(%S) as %T",
- lValue, bundle, bundleGetMethod(), arg.name, arg.type.typeName().copy(nullable = true)
- )
+ is ObjectArrayType -> builder.apply {
+ val baseType = (arg.type.typeName() as ParameterizedTypeName).typeArguments.first()
+ addStatement(
+ "%L = %L.%L(%S)?.map { it as %T }?.toTypedArray()",
+ lValue, bundle, bundleGetMethod(), arg.name, baseType)
+ }
else -> builder.addStatement(
"%L = %L.%L(%S)",
lValue,
diff --git a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/InvalidXmlTest.kt b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/InvalidXmlTest.kt
index 9e79db1..45f5981 100644
--- a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/InvalidXmlTest.kt
+++ b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/InvalidXmlTest.kt
@@ -23,6 +23,7 @@
import androidx.navigation.safe.args.generator.NavParserErrors.invalidDefaultValueReference
import androidx.navigation.safe.args.generator.NavParserErrors.invalidId
import androidx.navigation.safe.args.generator.NavParserErrors.invalidNavReference
+import androidx.navigation.safe.args.generator.NavParserErrors.nullDefaultValueReference
import androidx.navigation.safe.args.generator.NavParserErrors.sameSanitizedNameActions
import androidx.navigation.safe.args.generator.NavParserErrors.sameSanitizedNameArguments
import androidx.navigation.safe.args.generator.NavParserErrors.typeIsNotNullable
@@ -44,6 +45,8 @@
ErrorMessage("unnamed_destination_with_action.xml", 25, 5, UNNAMED_DESTINATION),
ErrorMessage("invalid_default_value_reference.xml", 23, 9,
invalidDefaultValueReference("foo/")),
+ ErrorMessage("null_default_value_reference.xml", 23, 9,
+ nullDefaultValueReference("myarg1")),
ErrorMessage("invalid_default_value_int.xml", 24, 9,
invalidDefaultValue("101034f", IntType)),
ErrorMessage("invalid_id_action.xml", 22, 44, invalidId("@+fppid/finish")),
diff --git a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/JavaNavWriterTest.kt b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/JavaNavWriterTest.kt
index 724cf24..0677ac2 100644
--- a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/JavaNavWriterTest.kt
+++ b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/JavaNavWriterTest.kt
@@ -170,6 +170,7 @@
Argument("optional", IntType, IntValue("-1")),
Argument("reference", ReferenceType, ReferenceValue(ResReference("a.b", "drawable",
"background"))),
+ Argument("referenceZeroDefaultValue", ReferenceType, IntValue("0")),
Argument("floatArg", FloatType, FloatValue("1")),
Argument("floatArrayArg", FloatArrayType),
Argument("objectArrayArg", ObjectArrayType(
diff --git a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/KotlinNavWriterTest.kt b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/KotlinNavWriterTest.kt
index 1c121d5..1942a23 100644
--- a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/KotlinNavWriterTest.kt
+++ b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/KotlinNavWriterTest.kt
@@ -112,6 +112,7 @@
Argument("optional", IntType, IntValue("-1")),
Argument("reference", ReferenceType, ReferenceValue(ResReference("a.b", "drawable",
"background"))),
+ Argument("referenceZeroDefaultValue", ReferenceType, IntValue("0")),
Argument("floatArg", FloatType, FloatValue("1")),
Argument("floatArrayArg", FloatArrayType),
Argument("objectArrayArg", ObjectArrayType("android.content.pm.ActivityInfo")),
diff --git a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/NavParserTest.kt b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/NavParserTest.kt
index 701e936..4b189bd 100644
--- a/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/NavParserTest.kt
+++ b/navigation/safe-args-generator/src/tests/kotlin/androidx/navigation/safe/args/generator/NavParserTest.kt
@@ -47,6 +47,7 @@
Argument("myarg2", StringType),
Argument("randomArgument", StringType),
Argument("intArgument", IntType, IntValue("261")),
+ Argument("referenceZeroDefaultValue", ReferenceType, IntValue("0")),
Argument(
"activityInfo",
ObjectType("android.content.pm.ActivityInfo")
diff --git a/navigation/safe-args-generator/src/tests/test-data/expected/java_nav_writer_test/MainFragmentArgs.java b/navigation/safe-args-generator/src/tests/test-data/expected/java_nav_writer_test/MainFragmentArgs.java
index 54d6a4d..9b27998 100644
--- a/navigation/safe-args-generator/src/tests/test-data/expected/java_nav_writer_test/MainFragmentArgs.java
+++ b/navigation/safe-args-generator/src/tests/test-data/expected/java_nav_writer_test/MainFragmentArgs.java
@@ -28,6 +28,7 @@
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
+import java.lang.System;
import java.nio.file.AccessMode;
import java.util.HashMap;
@@ -66,6 +67,11 @@
reference = bundle.getInt("reference");
__result.arguments.put("reference", reference);
}
+ if (bundle.containsKey("referenceZeroDefaultValue")) {
+ int referenceZeroDefaultValue;
+ referenceZeroDefaultValue = bundle.getInt("referenceZeroDefaultValue");
+ __result.arguments.put("referenceZeroDefaultValue", referenceZeroDefaultValue);
+ }
if (bundle.containsKey("floatArg")) {
float floatArg;
floatArg = bundle.getFloat("floatArg");
@@ -83,7 +89,13 @@
}
if (bundle.containsKey("objectArrayArg")) {
ActivityInfo[] objectArrayArg;
- objectArrayArg = (ActivityInfo[]) bundle.getParcelableArray("objectArrayArg");
+ Parcelable[] __array = bundle.getParcelableArray("objectArrayArg");
+ if (__array != null) {
+ objectArrayArg = new ActivityInfo[__array.length];
+ System.arraycopy(__array, 0, objectArrayArg, 0, __array.length);
+ } else {
+ objectArrayArg = null;
+ }
if (objectArrayArg == null) {
throw new IllegalArgumentException("Argument \"objectArrayArg\" is marked as non-null but was passed a null value.");
}
@@ -137,6 +149,11 @@
}
@SuppressWarnings("unchecked")
+ public int getReferenceZeroDefaultValue() {
+ return (int) arguments.get("referenceZeroDefaultValue");
+ }
+
+ @SuppressWarnings("unchecked")
public float getFloatArg() {
return (float) arguments.get("floatArg");
}
@@ -186,6 +203,10 @@
int reference = (int) arguments.get("reference");
__result.putInt("reference", reference);
}
+ if (arguments.containsKey("referenceZeroDefaultValue")) {
+ int referenceZeroDefaultValue = (int) arguments.get("referenceZeroDefaultValue");
+ __result.putInt("referenceZeroDefaultValue", referenceZeroDefaultValue);
+ }
if (arguments.containsKey("floatArg")) {
float floatArg = (float) arguments.get("floatArg");
__result.putFloat("floatArg", floatArg);
@@ -252,6 +273,12 @@
if (getReference() != that.getReference()) {
return false;
}
+ if (arguments.containsKey("referenceZeroDefaultValue") != that.arguments.containsKey("referenceZeroDefaultValue")) {
+ return false;
+ }
+ if (getReferenceZeroDefaultValue() != that.getReferenceZeroDefaultValue()) {
+ return false;
+ }
if (arguments.containsKey("floatArg") != that.arguments.containsKey("floatArg")) {
return false;
}
@@ -297,6 +324,7 @@
result = 31 * result + (getMain() != null ? getMain().hashCode() : 0);
result = 31 * result + getOptional();
result = 31 * result + getReference();
+ result = 31 * result + getReferenceZeroDefaultValue();
result = 31 * result + Float.floatToIntBits(getFloatArg());
result = 31 * result + java.util.Arrays.hashCode(getFloatArrayArg());
result = 31 * result + java.util.Arrays.hashCode(getObjectArrayArg());
@@ -312,6 +340,7 @@
+ "main=" + getMain()
+ ", optional=" + getOptional()
+ ", reference=" + getReference()
+ + ", referenceZeroDefaultValue=" + getReferenceZeroDefaultValue()
+ ", floatArg=" + getFloatArg()
+ ", floatArrayArg=" + getFloatArrayArg()
+ ", objectArrayArg=" + getObjectArrayArg()
@@ -372,6 +401,12 @@
}
@NonNull
+ public Builder setReferenceZeroDefaultValue(int referenceZeroDefaultValue) {
+ this.arguments.put("referenceZeroDefaultValue", referenceZeroDefaultValue);
+ return this;
+ }
+
+ @NonNull
public Builder setFloatArg(float floatArg) {
this.arguments.put("floatArg", floatArg);
return this;
@@ -433,6 +468,11 @@
}
@SuppressWarnings("unchecked")
+ public int getReferenceZeroDefaultValue() {
+ return (int) arguments.get("referenceZeroDefaultValue");
+ }
+
+ @SuppressWarnings("unchecked")
public float getFloatArg() {
return (float) arguments.get("floatArg");
}
diff --git a/navigation/safe-args-generator/src/tests/test-data/expected/kotlin_nav_writer_test/MainFragmentArgs.kt b/navigation/safe-args-generator/src/tests/test-data/expected/kotlin_nav_writer_test/MainFragmentArgs.kt
index f87f02b..84b4ed0 100644
--- a/navigation/safe-args-generator/src/tests/test-data/expected/kotlin_nav_writer_test/MainFragmentArgs.kt
+++ b/navigation/safe-args-generator/src/tests/test-data/expected/kotlin_nav_writer_test/MainFragmentArgs.kt
@@ -21,6 +21,7 @@
val main: String,
val optional: Int = -1,
val reference: Int = a.b.R.drawable.background,
+ val referenceZeroDefaultValue: Int = 0,
val floatArg: Float = 1F,
val floatArrayArg: FloatArray,
val objectArrayArg: Array<ActivityInfo>,
@@ -34,6 +35,7 @@
result.putString("main", this.main)
result.putInt("optional", this.optional)
result.putInt("reference", this.reference)
+ result.putInt("referenceZeroDefaultValue", this.referenceZeroDefaultValue)
result.putFloat("floatArg", this.floatArg)
result.putFloatArray("floatArrayArg", this.floatArrayArg)
result.putParcelableArray("objectArrayArg", this.objectArrayArg)
@@ -77,6 +79,12 @@
} else {
__reference = a.b.R.drawable.background
}
+ val __referenceZeroDefaultValue : Int
+ if (bundle.containsKey("referenceZeroDefaultValue")) {
+ __referenceZeroDefaultValue = bundle.getInt("referenceZeroDefaultValue")
+ } else {
+ __referenceZeroDefaultValue = 0
+ }
val __floatArg : Float
if (bundle.containsKey("floatArg")) {
__floatArg = bundle.getFloat("floatArg")
@@ -94,8 +102,8 @@
}
val __objectArrayArg : Array<ActivityInfo>?
if (bundle.containsKey("objectArrayArg")) {
- __objectArrayArg = bundle.getParcelableArray("objectArrayArg") as
- Array<ActivityInfo>?
+ __objectArrayArg = bundle.getParcelableArray("objectArrayArg")?.map { it as
+ ActivityInfo }?.toTypedArray()
if (__objectArrayArg == null) {
throw IllegalArgumentException("Argument \"objectArrayArg\" is marked as non-null but was passed a null value.")
}
@@ -135,8 +143,9 @@
} else {
__enumArg = AccessMode.READ
}
- return MainFragmentArgs(__main, __optional, __reference, __floatArg, __floatArrayArg,
- __objectArrayArg, __boolArg, __optionalParcelable, __enumArg)
+ return MainFragmentArgs(__main, __optional, __reference, __referenceZeroDefaultValue,
+ __floatArg, __floatArrayArg, __objectArrayArg, __boolArg, __optionalParcelable,
+ __enumArg)
}
}
}
diff --git a/navigation/safe-args-generator/src/tests/test-data/invalid_xmls/null_default_value_reference.xml b/navigation/safe-args-generator/src/tests/test-data/invalid_xmls/null_default_value_reference.xml
new file mode 100644
index 0000000..f3c9597
--- /dev/null
+++ b/navigation/safe-args-generator/src/tests/test-data/invalid_xmls/null_default_value_reference.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/foo"
+ app:startDestination="@+id/first_screen">
+ <fragment android:name="a.FakeFragment">
+ <argument android:name="myarg1" android:defaultValue="@null" app:argType="reference" />
+ </fragment>
+</navigation>
\ No newline at end of file
diff --git a/navigation/safe-args-generator/src/tests/test-data/naive_test.xml b/navigation/safe-args-generator/src/tests/test-data/naive_test.xml
index f220d8e..b7d25438 100644
--- a/navigation/safe-args-generator/src/tests/test-data/naive_test.xml
+++ b/navigation/safe-args-generator/src/tests/test-data/naive_test.xml
@@ -25,6 +25,7 @@
<argument android:name="myarg2" app:argType="string"/>
<argument android:name="randomArgument" app:argType="string"/>
<argument android:name="intArgument" app:argType="integer" android:defaultValue="261"/>
+ <argument android:name="referenceZeroDefaultValue" app:argType="reference" android:defaultValue="0"/>
<argument android:name="activityInfo" app:argType="android.content.pm.ActivityInfo"/>
<argument android:name="activityInfoNull"
app:nullable="true"
diff --git a/navigation/safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/ArgumentsGenerationTask.kt b/navigation/safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/ArgumentsGenerationTask.kt
index 2aae2bf..b064f95 100644
--- a/navigation/safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/ArgumentsGenerationTask.kt
+++ b/navigation/safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/ArgumentsGenerationTask.kt
@@ -128,7 +128,9 @@
modified.flatMap { it.javaFiles }
.filter { name -> name !in newJavaFiles }
.forEach { javaName ->
- val fileName = "${javaName.replace('.', File.separatorChar)}.java"
+ val fileExtension = if (generateKotlin) { ".kt" } else { ".java" }
+ val fileName =
+ "${javaName.replace('.', File.separatorChar)}$fileExtension"
val file = File(outputDir, fileName)
if (file.exists()) {
file.delete()
diff --git a/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/BasePluginTest.kt b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/BasePluginTest.kt
new file mode 100644
index 0000000..031163d
--- /dev/null
+++ b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/BasePluginTest.kt
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.navigation.safeargs.gradle
+
+import org.gradle.testkit.runner.BuildResult
+import org.gradle.testkit.runner.GradleRunner
+import org.gradle.testkit.runner.TaskOutcome
+import org.hamcrest.CoreMatchers
+import org.hamcrest.MatcherAssert
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.rules.TemporaryFolder
+import java.io.File
+import java.util.Properties
+
+internal const val MAIN_DIR = "androidx/navigation/testapp"
+
+internal const val NEXT_DIRECTIONS = "$MAIN_DIR/NextFragmentDirections"
+internal const val NEXT_ARGUMENTS = "$MAIN_DIR/NextFragmentArgs"
+internal const val MAIN_DIRECTIONS = "$MAIN_DIR/MainFragmentDirections"
+internal const val MODIFIED_NEXT_DIRECTIONS = "$MAIN_DIR/ModifiedNextFragmentDirections"
+internal const val ADDITIONAL_DIRECTIONS = "$MAIN_DIR/AdditionalFragmentDirections"
+internal const val FOO_DIRECTIONS = "$MAIN_DIR/foo/FooFragmentDirections"
+internal const val FEATURE_DIRECTIONS = "$MAIN_DIR/FeatureFragmentDirections"
+internal const val LIBRARY_DIRECTIONS = "$MAIN_DIR/LibraryFragmentDirections"
+internal const val FOO_DYNAMIC_DIRECTIONS =
+ "safe/gradle/test/app/safe/app/foo/DynFooFeatureFragmentDirections"
+internal const val NOTFOO_DYNAMIC_DIRECTIONS = "$MAIN_DIR/DynFeatureFragmentDirections"
+
+internal const val NAV_RESOURCES = "src/main/res/navigation"
+internal const val SEC = 1000L
+
+abstract class BasePluginTest {
+ @Suppress("MemberVisibilityCanBePrivate")
+ @get:Rule
+ val testProjectDir = TemporaryFolder()
+
+ internal var buildFile: File = File("")
+ internal var prebuiltsRepo = ""
+ internal var compileSdkVersion = ""
+ internal var buildToolsVersion = ""
+ internal var minSdkVersion = ""
+ internal var debugKeystore = ""
+ internal var navigationCommon = ""
+ internal var kotlinStblib = ""
+
+ internal fun projectRoot(): File = testProjectDir.root
+
+ internal fun assertGenerated(name: String, prefix: String? = null): File {
+ return prefix?.let { assertExists(name, true, it) } ?: assertExists(name, true)
+ }
+
+ internal fun assertNotGenerated(name: String, prefix: String? = null): File {
+ return prefix?.let { assertExists(name, false, it) } ?: assertExists(name, false)
+ }
+
+ internal fun assertExists(name: String, ex: Boolean, prefix: String = ""): File {
+ val generatedFile = File(
+ projectRoot(),
+ "${prefix}build/$GENERATED_PATH/$name"
+ )
+ MatcherAssert.assertThat(
+ generatedFile.exists(),
+ CoreMatchers.`is`(ex)
+ )
+ return generatedFile
+ }
+
+ internal fun navResource(name: String) =
+ File(projectRoot(), "$NAV_RESOURCES/$name")
+
+ internal fun gradleBuilder(vararg args: String) = GradleRunner.create()
+ .withProjectDir(projectRoot()).withPluginClasspath().withArguments(*args)
+
+ internal fun runGradle(vararg args: String) = gradleBuilder(*args).build()
+ internal fun runAndFailGradle(vararg args: String) = gradleBuilder(*args).buildAndFail()
+
+ @Before
+ fun setup() {
+ projectRoot().mkdirs()
+ buildFile = File(projectRoot(), "build.gradle")
+ buildFile.createNewFile()
+ // copy local.properties
+ val appToolkitProperties = File("../../local.properties")
+ if (appToolkitProperties.exists()) {
+ appToolkitProperties.copyTo(
+ File(projectRoot(), "local.properties"),
+ overwrite = true
+ )
+ } else {
+ File("../../local.properties").copyTo(
+ File(projectRoot(), "local.properties"), overwrite = true
+ )
+ }
+ val stream = BasePluginTest::class.java.classLoader.getResourceAsStream("sdk.prop")
+ val properties = Properties()
+ properties.load(stream)
+ prebuiltsRepo = properties.getProperty("prebuiltsRepo")
+ compileSdkVersion = properties.getProperty("compileSdkVersion")
+ buildToolsVersion = properties.getProperty("buildToolsVersion")
+ minSdkVersion = properties.getProperty("minSdkVersion")
+ debugKeystore = properties.getProperty("debugKeystore")
+ navigationCommon = properties.getProperty("navigationCommon")
+ kotlinStblib = properties.getProperty("kotlinStdlib")
+ }
+
+ internal fun setupSimpleBuildGradle() {
+ testData("app-project").copyRecursively(projectRoot())
+ buildFile.writeText("""
+ plugins {
+ id('com.android.application')
+ id('androidx.navigation.safeargs')
+ }
+
+ repositories {
+ maven { url "$prebuiltsRepo/androidx/external" }
+ maven { url "$prebuiltsRepo/androidx/internal" }
+ }
+
+ android {
+ compileSdkVersion $compileSdkVersion
+ buildToolsVersion "$buildToolsVersion"
+
+ defaultConfig {
+ minSdkVersion $minSdkVersion
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file("$debugKeystore")
+ }
+ }
+ }
+
+ dependencies {
+ implementation "$navigationCommon"
+ }
+ """.trimIndent()
+ )
+ }
+
+ internal fun setupMultiModuleBuildGradle() {
+ testData("multimodule-project").copyRecursively(projectRoot())
+ buildFile.writeText("""
+ buildscript {
+ ext.compileSdk = $compileSdkVersion
+ ext.buildTools = "$buildToolsVersion"
+ ext.minSdk = $minSdkVersion
+ ext.debugKeystoreFile = "$debugKeystore"
+ ext.navigationCommonDep = "$navigationCommon"
+ }
+
+ allprojects {
+ repositories {
+ maven { url "$prebuiltsRepo/androidx/external" }
+ maven { url "$prebuiltsRepo/androidx/internal" }
+ }
+ }
+ """.trimIndent()
+ )
+ }
+
+ internal fun setupSimpleKotlinBuildGradle() {
+ testData("app-project-kotlin").copyRecursively(projectRoot())
+ buildFile.writeText("""
+ plugins {
+ id('com.android.application')
+ id('kotlin-android')
+ id('androidx.navigation.safeargs.kotlin')
+ }
+
+ repositories {
+ maven { url "$prebuiltsRepo/androidx/external" }
+ maven { url "$prebuiltsRepo/androidx/internal" }
+ }
+
+ android {
+ compileSdkVersion $compileSdkVersion
+ buildToolsVersion "$buildToolsVersion"
+
+ defaultConfig {
+ minSdkVersion $minSdkVersion
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file("$debugKeystore")
+ }
+ }
+ }
+
+ dependencies {
+ implementation "$kotlinStblib"
+ implementation "$navigationCommon"
+ }
+ """.trimIndent()
+ )
+ }
+}
+
+internal fun testData(name: String) = File("src/test/test-data", name)
+
+internal fun BuildResult.assertSuccessfulTask(name: String): BuildResult {
+ assertThat(task(":$name")!!.outcome, CoreMatchers.`is`(TaskOutcome.SUCCESS))
+ return this
+}
+
+internal fun BuildResult.assertFailingTask(name: String): BuildResult {
+ assertThat(task(":$name")!!.outcome, CoreMatchers.`is`(TaskOutcome.FAILED))
+ return this
+}
\ No newline at end of file
diff --git a/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt
new file mode 100644
index 0000000..d557e1b
--- /dev/null
+++ b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.navigation.safeargs.gradle
+
+import org.hamcrest.CoreMatchers
+import org.hamcrest.MatcherAssert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+// Does not work in the Android Studio
+@RunWith(Parameterized::class)
+class IncrementalPluginTest(private val generateKotlin: Boolean) : BasePluginTest() {
+
+ private val extension = if (generateKotlin) { ".kt" } else { ".java" }
+
+ private fun setupBuildGradle() {
+ if (generateKotlin) {
+ setupSimpleKotlinBuildGradle()
+ } else {
+ setupSimpleBuildGradle()
+ }
+ }
+
+ @Test
+ fun incrementalAdd() {
+ setupBuildGradle()
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+ val nextLastMod = assertGenerated("debug/$NEXT_DIRECTIONS$extension").lastModified()
+
+ testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
+
+ // lastModified has one second precision on certain platforms and jdk versions
+ // so sleep for a second
+ Thread.sleep(SEC)
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+ assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension")
+ val newNextLastMod = assertGenerated("debug/$NEXT_DIRECTIONS$extension").lastModified()
+ MatcherAssert.assertThat(
+ newNextLastMod,
+ CoreMatchers.`is`(nextLastMod)
+ )
+ }
+
+ @Test
+ fun incrementalModify() {
+ setupBuildGradle()
+ testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
+
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+ val mainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS$extension").lastModified()
+ val additionalLastMod = assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension")
+ .lastModified()
+ assertGenerated("debug/$NEXT_DIRECTIONS$extension")
+
+ testData("incremental-test-data/modified_nav.xml").copyTo(
+ navResource("nav_test.xml"),
+ true
+ )
+
+ // lastModified has one second precision on certain platforms and jdk versions
+ // so sleep for a second
+ Thread.sleep(SEC)
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+ val newMainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS$extension").lastModified()
+ // main directions were regenerated
+ MatcherAssert.assertThat(
+ newMainLastMod,
+ CoreMatchers.not(mainLastMod)
+ )
+
+ // but additional directions weren't touched
+ val newAdditionalLastMod =
+ assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension").lastModified()
+ MatcherAssert.assertThat(
+ newAdditionalLastMod,
+ CoreMatchers.`is`(additionalLastMod)
+ )
+
+ assertGenerated("debug/$MODIFIED_NEXT_DIRECTIONS$extension")
+ assertNotGenerated("debug/$NEXT_DIRECTIONS$extension")
+ }
+
+ @Test
+ fun incrementalRemove() {
+ setupBuildGradle()
+ testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
+
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+ val mainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS$extension").lastModified()
+ assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension")
+
+ val wasRemoved = navResource("add_nav.xml").delete()
+ MatcherAssert.assertThat(wasRemoved, CoreMatchers.`is`(true))
+
+ // lastModified has one second precision on certain platforms and jdk versions
+ // so sleep for a second
+ Thread.sleep(SEC)
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+ val newMainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS$extension").lastModified()
+ // main directions weren't touched
+ MatcherAssert.assertThat(
+ newMainLastMod,
+ CoreMatchers.`is`(mainLastMod)
+ )
+
+ // but additional directions are removed
+ assertNotGenerated("debug/$ADDITIONAL_DIRECTIONS$extension")
+ }
+
+ @Test
+ fun invalidModify() {
+ setupBuildGradle()
+ testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
+ runGradle("generateSafeArgsDebug").assertSuccessfulTask("generateSafeArgsDebug")
+ val step1MainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS$extension").lastModified()
+ val step1AdditionalLastMod =
+ assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension").lastModified()
+ assertGenerated("debug/$NEXT_DIRECTIONS$extension")
+
+ testData("invalid/failing_nav.xml")
+ .copyTo(navResource("nav_test.xml"), true)
+ Thread.sleep(SEC)
+ runAndFailGradle("generateSafeArgsDebug").assertFailingTask("generateSafeArgsDebug")
+ val step2MainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS$extension").lastModified()
+ // main directions were regenerated
+ MatcherAssert.assertThat(
+ step2MainLastMod,
+ CoreMatchers.not(step1MainLastMod)
+ )
+
+ // but additional directions weren't touched
+ val step2AdditionalLastMod =
+ assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension").lastModified()
+ MatcherAssert.assertThat(
+ step2AdditionalLastMod,
+ CoreMatchers.`is`(step1AdditionalLastMod)
+ )
+
+ val step2ModifiedTime =
+ assertGenerated("debug/$MODIFIED_NEXT_DIRECTIONS$extension").lastModified()
+ assertNotGenerated("debug/$NEXT_DIRECTIONS$extension")
+
+ testData("incremental-test-data/modified_nav.xml").copyTo(
+ navResource("nav_test.xml"),
+ true
+ )
+ Thread.sleep(SEC)
+ runGradle("generateSafeArgsDebug").assertSuccessfulTask("generateSafeArgsDebug")
+
+ // additional directions are touched because once task failed,
+ // gradle next time makes full run
+ val step3AdditionalLastMod =
+ assertGenerated("debug/$ADDITIONAL_DIRECTIONS$extension").lastModified()
+ MatcherAssert.assertThat(
+ step3AdditionalLastMod,
+ CoreMatchers.not(step2AdditionalLastMod)
+ )
+
+ val step3ModifiedTime =
+ assertGenerated("debug/$MODIFIED_NEXT_DIRECTIONS$extension").lastModified()
+ MatcherAssert.assertThat(
+ step2ModifiedTime,
+ CoreMatchers.not(step3ModifiedTime)
+ )
+ }
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "generateKotlin={0}")
+ fun data() = listOf(false, true)
+ }
+}
\ No newline at end of file
diff --git a/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt
new file mode 100644
index 0000000..0456492
--- /dev/null
+++ b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.navigation.safeargs.gradle
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+// Does not work in the Android Studio
+@RunWith(JUnit4::class)
+class JavaPluginTest : BasePluginTest() {
+
+ @Test
+ fun runGenerateTask() {
+ testData("app-project").copyRecursively(projectRoot())
+ buildFile.writeText("""
+ plugins {
+ id('com.android.application')
+ id('androidx.navigation.safeargs')
+ }
+
+ repositories {
+ maven { url "$prebuiltsRepo/androidx/external" }
+ maven { url "$prebuiltsRepo/androidx/internal" }
+ }
+
+ android {
+ compileSdkVersion $compileSdkVersion
+ buildToolsVersion "$buildToolsVersion"
+ flavorDimensions "mode"
+ productFlavors {
+ foo {
+ dimension "mode"
+ applicationIdSuffix ".foo"
+ }
+ notfoo {
+ dimension "mode"
+ }
+
+ }
+
+ defaultConfig {
+ minSdkVersion $minSdkVersion
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file("$debugKeystore")
+ }
+ }
+ }
+
+ dependencies {
+ implementation "$navigationCommon"
+ }
+ """.trimIndent()
+ )
+
+ runGradle("assembleNotfooDebug", "assembleFooDebug")
+ .assertSuccessfulTask("assembleNotfooDebug")
+ .assertSuccessfulTask("assembleFooDebug")
+
+ assertGenerated("notfoo/debug/$NEXT_DIRECTIONS.java")
+ assertGenerated("notfoo/debug/$NEXT_ARGUMENTS.java")
+ assertNotGenerated("foo/debug/$NEXT_DIRECTIONS.java")
+ assertGenerated("foo/debug/$FOO_DIRECTIONS.java")
+ }
+
+ @Test
+ fun generateForFeature() {
+ setupMultiModuleBuildGradle()
+ runGradle(
+ ":feature:assembleFooDebugFeature",
+ ":feature:assembleNotfooDebugFeature"
+ )
+ .assertSuccessfulTask("feature:assembleNotfooDebugFeature")
+ .assertSuccessfulTask("feature:assembleFooDebugFeature")
+
+ assertGenerated("foo/debug/$FEATURE_DIRECTIONS.java", "feature/")
+ assertGenerated("notfoo/debug/$FEATURE_DIRECTIONS.java", "feature/")
+ }
+
+ @Test
+ fun generateForLibrary() {
+ setupMultiModuleBuildGradle()
+ runGradle(
+ ":library:assembleFooDebug",
+ ":library:assembleNotfooDebug"
+ )
+ .assertSuccessfulTask("library:assembleNotfooDebug")
+ .assertSuccessfulTask("library:assembleFooDebug")
+
+ assertGenerated("foo/debug/$LIBRARY_DIRECTIONS.java", "library/")
+ assertGenerated("notfoo/debug/$LIBRARY_DIRECTIONS.java", "library/")
+ }
+
+ @Test
+ fun generateForBaseFeature() {
+ setupMultiModuleBuildGradle()
+ runGradle(
+ ":base:assembleFooDebugFeature",
+ ":base:assembleNotfooDebugFeature"
+ )
+ .assertSuccessfulTask("base:assembleNotfooDebugFeature")
+ .assertSuccessfulTask("base:assembleFooDebugFeature")
+
+ assertGenerated("foo/debug/$MAIN_DIRECTIONS.java", "base/")
+ assertGenerated("notfoo/debug/$MAIN_DIRECTIONS.java", "base/")
+ assertGenerated("foo/debug/$NEXT_DIRECTIONS.java", "base/")
+ assertGenerated("notfoo/debug/$NEXT_DIRECTIONS.java", "base/")
+ }
+
+ @Test
+ fun generateForDynamicFeature() {
+ setupMultiModuleBuildGradle()
+ runGradle(
+ ":dynamic_feature:assembleFooDebug",
+ ":dynamic_feature:assembleNotfooDebug"
+ )
+ .assertSuccessfulTask("dynamic_feature:assembleNotfooDebug")
+ .assertSuccessfulTask("dynamic_feature:assembleFooDebug")
+
+ assertGenerated("notfoo/debug/$NOTFOO_DYNAMIC_DIRECTIONS.java", "dynamic_feature/")
+ assertNotGenerated("foo/debug/$NOTFOO_DYNAMIC_DIRECTIONS.java", "dynamic_feature/")
+ assertGenerated("foo/debug/$FOO_DYNAMIC_DIRECTIONS.java", "dynamic_feature/")
+ assertNotGenerated("notfoo/debug/$FOO_DYNAMIC_DIRECTIONS.java", "dynamic_feature/")
+ }
+}
\ No newline at end of file
diff --git a/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt
new file mode 100644
index 0000000..46c1429
--- /dev/null
+++ b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.navigation.safeargs.gradle
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+// Does not work in the Android Studio
+@RunWith(JUnit4::class)
+class KotlinPluginTest : BasePluginTest() {
+
+ @Test
+ fun runGenerateTaskForKotlin() {
+ setupSimpleKotlinBuildGradle()
+ runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
+
+ assertGenerated("debug/$NEXT_ARGUMENTS.kt")
+ assertGenerated("debug/$NEXT_ARGUMENTS.kt")
+ assertGenerated("debug/$MAIN_DIRECTIONS.kt")
+ }
+}
\ No newline at end of file
diff --git a/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/PluginTest.kt b/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/PluginTest.kt
deleted file mode 100644
index 7e516de..0000000
--- a/navigation/safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/PluginTest.kt
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- * 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.navigation.safeargs.gradle
-
-import org.gradle.testkit.runner.BuildResult
-import org.gradle.testkit.runner.GradleRunner
-import org.gradle.testkit.runner.TaskOutcome
-import org.hamcrest.CoreMatchers.`is`
-import org.hamcrest.CoreMatchers.not
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TemporaryFolder
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import java.io.File
-import java.util.Properties
-
-private const val MAIN_DIR = "androidx/navigation/testapp"
-
-private const val NEXT_DIRECTIONS = "$MAIN_DIR/NextFragmentDirections.java"
-private const val NEXT_ARGUMENTS = "$MAIN_DIR/NextFragmentArgs.java"
-private const val NEXT_ARGUMENTS_KT = "$MAIN_DIR/NextFragmentArgs.kt"
-private const val MAIN_DIRECTIONS = "$MAIN_DIR/MainFragmentDirections.java"
-private const val MAIN_DIRECTIONS_KT = "$MAIN_DIR/MainFragmentDirections.kt"
-private const val MODIFIED_NEXT_DIRECTIONS = "$MAIN_DIR/ModifiedNextFragmentDirections.java"
-private const val ADDITIONAL_DIRECTIONS = "$MAIN_DIR/AdditionalFragmentDirections.java"
-private const val FOO_DIRECTIONS = "$MAIN_DIR/foo/FooFragmentDirections.java"
-private const val FEATURE_DIRECTIONS = "$MAIN_DIR/FeatureFragmentDirections.java"
-private const val LIBRARY_DIRECTIONS = "$MAIN_DIR/LibraryFragmentDirections.java"
-private const val FOO_DYNAMIC_DIRECTIONS =
- "safe/gradle/test/app/safe/app/foo/DynFooFeatureFragmentDirections.java"
-private const val NOTFOO_DYNAMIC_DIRECTIONS = "$MAIN_DIR/DynFeatureFragmentDirections.java"
-
-private const val NAV_RESOURCES = "src/main/res/navigation"
-private const val SEC = 1000L
-
-// Does not work in the Android Studio
-@RunWith(JUnit4::class)
-class PluginTest {
-
- @Suppress("MemberVisibilityCanBePrivate")
- @get:Rule
- val testProjectDir = TemporaryFolder()
-
- private var buildFile: File = File("")
- private var prebuiltsRepo = ""
- private var compileSdkVersion = ""
- private var buildToolsVersion = ""
- private var minSdkVersion = ""
- private var debugKeystore = ""
- private var navigationCommon = ""
- private var kotlinStblib = ""
-
- private fun projectRoot(): File = testProjectDir.root
-
- private fun assertGenerated(name: String, prefix: String? = null): File {
- return prefix?.let { assertExists(name, true, it) } ?: assertExists(name, true)
- }
-
- private fun assertNotGenerated(name: String, prefix: String? = null): File {
- return prefix?.let { assertExists(name, false, it) } ?: assertExists(name, false)
- }
-
- private fun assertExists(name: String, ex: Boolean, prefix: String = ""): File {
- val generatedFile = File(projectRoot(), "${prefix}build/$GENERATED_PATH/$name")
- assertThat(generatedFile.exists(), `is`(ex))
- return generatedFile
- }
-
- private fun navResource(name: String) = File(projectRoot(), "$NAV_RESOURCES/$name")
-
- private fun gradleBuilder(vararg args: String) = GradleRunner.create()
- .withProjectDir(projectRoot()).withPluginClasspath().withArguments(*args)
-
- private fun runGradle(vararg args: String) = gradleBuilder(*args).build()
- private fun runAndFailGradle(vararg args: String) = gradleBuilder(*args).buildAndFail()
-
- @Before
- fun setup() {
- projectRoot().mkdirs()
- buildFile = File(projectRoot(), "build.gradle")
- buildFile.createNewFile()
- // copy local.properties
- val appToolkitProperties = File("../../local.properties")
- if (appToolkitProperties.exists()) {
- appToolkitProperties.copyTo(File(projectRoot(), "local.properties"), overwrite = true)
- } else {
- File("../../local.properties").copyTo(
- File(projectRoot(), "local.properties"), overwrite = true)
- }
- val stream = PluginTest::class.java.classLoader.getResourceAsStream("sdk.prop")
- val properties = Properties()
- properties.load(stream)
- prebuiltsRepo = properties.getProperty("prebuiltsRepo")
- compileSdkVersion = properties.getProperty("compileSdkVersion")
- buildToolsVersion = properties.getProperty("buildToolsVersion")
- minSdkVersion = properties.getProperty("minSdkVersion")
- debugKeystore = properties.getProperty("debugKeystore")
- navigationCommon = properties.getProperty("navigationCommon")
- kotlinStblib = properties.getProperty("kotlinStdlib")
- }
-
- private fun setupSimpleBuildGradle() {
- testData("app-project").copyRecursively(projectRoot())
- buildFile.writeText("""
- plugins {
- id('com.android.application')
- id('androidx.navigation.safeargs')
- }
-
- repositories {
- maven { url "$prebuiltsRepo/androidx/external" }
- maven { url "$prebuiltsRepo/androidx/internal" }
- }
-
- android {
- compileSdkVersion $compileSdkVersion
- buildToolsVersion "$buildToolsVersion"
-
- defaultConfig {
- minSdkVersion $minSdkVersion
- }
-
- signingConfigs {
- debug {
- storeFile file("$debugKeystore")
- }
- }
- }
-
- dependencies {
- implementation "$navigationCommon"
- }
- """.trimIndent())
- }
-
- private fun setupMultiModuleBuildGradle() {
- testData("multimodule-project").copyRecursively(projectRoot())
- buildFile.writeText("""
- buildscript {
- ext.compileSdk = $compileSdkVersion
- ext.buildTools = "$buildToolsVersion"
- ext.minSdk = $minSdkVersion
- ext.debugKeystoreFile = "$debugKeystore"
- ext.navigationCommonDep = "$navigationCommon"
- }
-
- allprojects {
- repositories {
- maven { url "$prebuiltsRepo/androidx/external" }
- maven { url "$prebuiltsRepo/androidx/internal" }
- }
- }
- """.trimIndent())
- }
-
- @Test
- fun runGenerateTask() {
- testData("app-project").copyRecursively(projectRoot())
- buildFile.writeText("""
- plugins {
- id('com.android.application')
- id('androidx.navigation.safeargs')
- }
-
- repositories {
- maven { url "$prebuiltsRepo/androidx/external" }
- maven { url "$prebuiltsRepo/androidx/internal" }
- }
-
- android {
- compileSdkVersion $compileSdkVersion
- buildToolsVersion "$buildToolsVersion"
- flavorDimensions "mode"
- productFlavors {
- foo {
- dimension "mode"
- applicationIdSuffix ".foo"
- }
- notfoo {
- dimension "mode"
- }
-
- }
-
- defaultConfig {
- minSdkVersion $minSdkVersion
- }
-
- signingConfigs {
- debug {
- storeFile file("$debugKeystore")
- }
- }
- }
-
- dependencies {
- implementation "$navigationCommon"
- }
- """.trimIndent())
-
- runGradle("assembleNotfooDebug", "assembleFooDebug")
- .assertSuccessfulTask("assembleNotfooDebug")
- .assertSuccessfulTask("assembleFooDebug")
-
- assertGenerated("notfoo/debug/$NEXT_DIRECTIONS")
- assertGenerated("notfoo/debug/$NEXT_ARGUMENTS")
- assertNotGenerated("foo/debug/$NEXT_DIRECTIONS")
- assertGenerated("foo/debug/$FOO_DIRECTIONS")
- }
-
- @Test
- fun runGenerateTaskForKotlin() {
- testData("app-project-kotlin").copyRecursively(projectRoot())
- buildFile.writeText("""
- plugins {
- id('com.android.application')
- id('kotlin-android')
- id('androidx.navigation.safeargs.kotlin')
- }
-
- repositories {
- maven { url "$prebuiltsRepo/androidx/external" }
- maven { url "$prebuiltsRepo/androidx/internal" }
- }
-
- android {
- compileSdkVersion $compileSdkVersion
- buildToolsVersion "$buildToolsVersion"
-
- defaultConfig {
- minSdkVersion $minSdkVersion
- }
-
- signingConfigs {
- debug {
- storeFile file("$debugKeystore")
- }
- }
- }
-
- dependencies {
- implementation "$kotlinStblib"
- implementation "$navigationCommon"
- }
- """.trimIndent())
-
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
-
- assertGenerated("debug/$NEXT_ARGUMENTS_KT")
- assertGenerated("debug/$NEXT_ARGUMENTS_KT")
- assertGenerated("debug/$MAIN_DIRECTIONS_KT")
- }
-
- @Test
- fun incrementalAdd() {
- setupSimpleBuildGradle()
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
- val nextLastMod = assertGenerated("debug/$NEXT_DIRECTIONS").lastModified()
-
- testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
-
- // lastModified has one second precision on certain platforms and jdk versions
- // so sleep for a second
- Thread.sleep(SEC)
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
- assertGenerated("debug/$ADDITIONAL_DIRECTIONS")
- val newNextLastMod = assertGenerated("debug/$NEXT_DIRECTIONS").lastModified()
- assertThat(newNextLastMod, `is`(nextLastMod))
- }
-
- @Test
- fun incrementalModify() {
- setupSimpleBuildGradle()
- testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
-
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
- val mainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS").lastModified()
- val additionalLastMod = assertGenerated("debug/$ADDITIONAL_DIRECTIONS").lastModified()
- assertGenerated("debug/$NEXT_DIRECTIONS")
-
- testData("incremental-test-data/modified_nav.xml").copyTo(navResource("nav_test.xml"), true)
-
- // lastModified has one second precision on certain platforms and jdk versions
- // so sleep for a second
- Thread.sleep(SEC)
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
- val newMainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS").lastModified()
- // main directions were regenerated
- assertThat(newMainLastMod, not(mainLastMod))
-
- // but additional directions weren't touched
- val newAdditionalLastMod = assertGenerated("debug/$ADDITIONAL_DIRECTIONS").lastModified()
- assertThat(newAdditionalLastMod, `is`(additionalLastMod))
-
- assertGenerated("debug/$MODIFIED_NEXT_DIRECTIONS")
- assertNotGenerated("debug/$NEXT_DIRECTIONS")
- }
-
- @Test
- fun incrementalRemove() {
- setupSimpleBuildGradle()
- testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
-
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
- val mainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS").lastModified()
- assertGenerated("debug/$ADDITIONAL_DIRECTIONS")
-
- val wasRemoved = navResource("add_nav.xml").delete()
- assertThat(wasRemoved, `is`(true))
-
- // lastModified has one second precision on certain platforms and jdk versions
- // so sleep for a second
- Thread.sleep(SEC)
- runGradle("assembleDebug").assertSuccessfulTask("assembleDebug")
- val newMainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS").lastModified()
- // main directions weren't touched
- assertThat(newMainLastMod, `is`(mainLastMod))
-
- // but additional directions are removed
- assertNotGenerated("debug/$ADDITIONAL_DIRECTIONS")
- }
-
- @Test
- fun invalidModify() {
- setupSimpleBuildGradle()
- testData("incremental-test-data/add_nav.xml").copyTo(navResource("add_nav.xml"))
- runGradle("generateSafeArgsDebug").assertSuccessfulTask("generateSafeArgsDebug")
- val step1MainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS").lastModified()
- val step1AdditionalLastMod = assertGenerated("debug/$ADDITIONAL_DIRECTIONS").lastModified()
- assertGenerated("debug/$NEXT_DIRECTIONS")
-
- testData("invalid/failing_nav.xml").copyTo(navResource("nav_test.xml"), true)
- Thread.sleep(SEC)
- runAndFailGradle("generateSafeArgsDebug").assertFailingTask("generateSafeArgsDebug")
- val step2MainLastMod = assertGenerated("debug/$MAIN_DIRECTIONS").lastModified()
- // main directions were regenerated
- assertThat(step2MainLastMod, not(step1MainLastMod))
-
- // but additional directions weren't touched
- val step2AdditionalLastMod = assertGenerated("debug/$ADDITIONAL_DIRECTIONS").lastModified()
- assertThat(step2AdditionalLastMod, `is`(step1AdditionalLastMod))
-
- val step2ModifiedTime = assertGenerated("debug/$MODIFIED_NEXT_DIRECTIONS").lastModified()
- assertNotGenerated("debug/$NEXT_DIRECTIONS")
-
- testData("incremental-test-data/modified_nav.xml").copyTo(navResource("nav_test.xml"), true)
- Thread.sleep(SEC)
- runGradle("generateSafeArgsDebug").assertSuccessfulTask("generateSafeArgsDebug")
-
- // additional directions are touched because once task failed,
- // gradle next time makes full run
- val step3AdditionalLastMod = assertGenerated("debug/$ADDITIONAL_DIRECTIONS").lastModified()
- assertThat(step3AdditionalLastMod, not(step2AdditionalLastMod))
-
- val step3ModifiedTime = assertGenerated("debug/$MODIFIED_NEXT_DIRECTIONS").lastModified()
- assertThat(step2ModifiedTime, not(step3ModifiedTime))
- }
-
- @Test
- fun generateForFeature() {
- setupMultiModuleBuildGradle()
- runGradle(
- ":feature:assembleFooDebugFeature",
- ":feature:assembleNotfooDebugFeature"
- )
- .assertSuccessfulTask("feature:assembleNotfooDebugFeature")
- .assertSuccessfulTask("feature:assembleFooDebugFeature")
-
- assertGenerated("foo/debug/$FEATURE_DIRECTIONS", "feature/")
- assertGenerated("notfoo/debug/$FEATURE_DIRECTIONS", "feature/")
- }
-
- @Test
- fun generateForLibrary() {
- setupMultiModuleBuildGradle()
- runGradle(
- ":library:assembleFooDebug",
- ":library:assembleNotfooDebug"
- )
- .assertSuccessfulTask("library:assembleNotfooDebug")
- .assertSuccessfulTask("library:assembleFooDebug")
-
- assertGenerated("foo/debug/$LIBRARY_DIRECTIONS", "library/")
- assertGenerated("notfoo/debug/$LIBRARY_DIRECTIONS", "library/")
- }
-
- @Test
- fun generateForBaseFeature() {
- setupMultiModuleBuildGradle()
- runGradle(
- ":base:assembleFooDebugFeature",
- ":base:assembleNotfooDebugFeature"
- )
- .assertSuccessfulTask("base:assembleNotfooDebugFeature")
- .assertSuccessfulTask("base:assembleFooDebugFeature")
-
- assertGenerated("foo/debug/$MAIN_DIRECTIONS", "base/")
- assertGenerated("notfoo/debug/$MAIN_DIRECTIONS", "base/")
- assertGenerated("foo/debug/$NEXT_DIRECTIONS", "base/")
- assertGenerated("notfoo/debug/$NEXT_DIRECTIONS", "base/")
- }
-
- @Test
- fun generateForDynamicFeature() {
- setupMultiModuleBuildGradle()
- runGradle(
- ":dynamic_feature:assembleFooDebug",
- ":dynamic_feature:assembleNotfooDebug"
- )
- .assertSuccessfulTask("dynamic_feature:assembleNotfooDebug")
- .assertSuccessfulTask("dynamic_feature:assembleFooDebug")
-
- assertGenerated("notfoo/debug/$NOTFOO_DYNAMIC_DIRECTIONS", "dynamic_feature/")
- assertNotGenerated("foo/debug/$NOTFOO_DYNAMIC_DIRECTIONS", "dynamic_feature/")
- assertGenerated("foo/debug/$FOO_DYNAMIC_DIRECTIONS", "dynamic_feature/")
- assertNotGenerated("notfoo/debug/$FOO_DYNAMIC_DIRECTIONS", "dynamic_feature/")
- }
-}
-
-private fun testData(name: String) = File("src/test/test-data", name)
-
-private fun BuildResult.assertSuccessfulTask(name: String): BuildResult {
- assertThat(task(":$name")!!.outcome, `is`(TaskOutcome.SUCCESS))
- return this
-}
-
-private fun BuildResult.assertFailingTask(name: String): BuildResult {
- assertThat(task(":$name")!!.outcome, `is`(TaskOutcome.FAILED))
- return this
-}
\ No newline at end of file
diff --git a/navigation/safe-args-gradle-plugin/src/test/test-data/app-project-kotlin/src/main/res/navigation/nav_test.xml b/navigation/safe-args-gradle-plugin/src/test/test-data/app-project-kotlin/src/main/res/navigation/nav_test.xml
index a6b1c87..fa455bd 100644
--- a/navigation/safe-args-gradle-plugin/src/test/test-data/app-project-kotlin/src/main/res/navigation/nav_test.xml
+++ b/navigation/safe-args-gradle-plugin/src/test/test-data/app-project-kotlin/src/main/res/navigation/nav_test.xml
@@ -45,6 +45,7 @@
<argument android:name="main"/>
<argument android:name="optional" android:defaultValue="-1"/>
<argument android:name="reference" android:defaultValue="@color/colorPrimary"/>
+ <argument android:name="referenceZeroDefaultValue" app:argType="reference" android:defaultValue="0"/>
<argument android:name="floatArg" android:defaultValue="-1.0"/>
<argument android:name="floatArrayArg" app:argType="float[]"/>
<argument android:name="objectArrayArg" app:argType="android.content.pm.ActivityInfo[]"/>
diff --git a/navigation/safe-args-gradle-plugin/src/test/test-data/app-project/src/main/res/navigation/nav_test.xml b/navigation/safe-args-gradle-plugin/src/test/test-data/app-project/src/main/res/navigation/nav_test.xml
index baa242a..73188f1 100644
--- a/navigation/safe-args-gradle-plugin/src/test/test-data/app-project/src/main/res/navigation/nav_test.xml
+++ b/navigation/safe-args-gradle-plugin/src/test/test-data/app-project/src/main/res/navigation/nav_test.xml
@@ -45,6 +45,7 @@
<argument android:name="main"/>
<argument android:name="optional" android:defaultValue="-1"/>
<argument android:name="reference" android:defaultValue="@color/colorPrimary"/>
+ <argument android:name="referenceZeroDefaultValue" app:argType="reference" android:defaultValue="0"/>
<argument android:name="floatArg" android:defaultValue="-1.0"/>
<argument android:name="floatArrayArg" app:argType="float[]"/>
<argument android:name="objectArrayArg" app:argType="android.content.pm.ActivityInfo[]"/>
diff --git a/navigation/ui/api/1.0.0-beta02.txt b/navigation/ui/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..af2f1c1
--- /dev/null
+++ b/navigation/ui/api/1.0.0-beta02.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+ public final class AppBarConfiguration {
+ method public android.support.v4.widget.DrawerLayout? getDrawerLayout();
+ method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+ method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+ }
+
+ public static final class AppBarConfiguration.Builder {
+ ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+ ctor public AppBarConfiguration.Builder(android.view.Menu);
+ ctor public AppBarConfiguration.Builder(int...);
+ ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer>);
+ method public androidx.navigation.ui.AppBarConfiguration build();
+ method public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(android.support.v4.widget.DrawerLayout?);
+ method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+ }
+
+ public static interface AppBarConfiguration.OnNavigateUpListener {
+ method public boolean onNavigateUp();
+ }
+
+ public final class NavigationUI {
+ method public static boolean navigateUp(androidx.navigation.NavController, android.support.v4.widget.DrawerLayout?);
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+ method public static void setupActionBarWithNavController(android.support.v7.app.AppCompatActivity, androidx.navigation.NavController);
+ method public static void setupActionBarWithNavController(android.support.v7.app.AppCompatActivity, androidx.navigation.NavController, android.support.v4.widget.DrawerLayout?);
+ method public static void setupActionBarWithNavController(android.support.v7.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(android.support.v7.widget.Toolbar, androidx.navigation.NavController);
+ method public static void setupWithNavController(android.support.v7.widget.Toolbar, androidx.navigation.NavController, android.support.v4.widget.DrawerLayout?);
+ method public static void setupWithNavController(android.support.v7.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(android.support.design.widget.CollapsingToolbarLayout, android.support.v7.widget.Toolbar, androidx.navigation.NavController);
+ method public static void setupWithNavController(android.support.design.widget.CollapsingToolbarLayout, android.support.v7.widget.Toolbar, androidx.navigation.NavController, android.support.v4.widget.DrawerLayout?);
+ method public static void setupWithNavController(android.support.design.widget.CollapsingToolbarLayout, android.support.v7.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(android.support.design.widget.NavigationView, androidx.navigation.NavController);
+ method public static void setupWithNavController(android.support.design.widget.BottomNavigationView, androidx.navigation.NavController);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/ui/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/ui/api/res-1.0.0-beta02.txt
diff --git a/navigation/ui/ktx/api/1.0.0-beta02.txt b/navigation/ui/ktx/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..578c40c
--- /dev/null
+++ b/navigation/ui/ktx/api/1.0.0-beta02.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+ public final class ActivityKt {
+ ctor public ActivityKt();
+ method public static void setupActionBarWithNavController(android.support.v7.app.AppCompatActivity, androidx.navigation.NavController navController, android.support.v4.widget.DrawerLayout? drawerLayout);
+ method public static void setupActionBarWithNavController(android.support.v7.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+ public final class AppBarConfigurationKt {
+ ctor public AppBarConfigurationKt();
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, android.support.v4.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, android.support.v4.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, android.support.v4.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ }
+
+ public final class BottomNavigationViewKt {
+ ctor public BottomNavigationViewKt();
+ method public static void setupWithNavController(android.support.design.widget.BottomNavigationView, androidx.navigation.NavController navController);
+ }
+
+ public final class CollapsingToolbarLayoutKt {
+ ctor public CollapsingToolbarLayoutKt();
+ method public static void setupWithNavController(android.support.design.widget.CollapsingToolbarLayout, android.support.v7.widget.Toolbar toolbar, androidx.navigation.NavController navController, android.support.v4.widget.DrawerLayout? drawerLayout);
+ method public static void setupWithNavController(android.support.design.widget.CollapsingToolbarLayout, android.support.v7.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+ public final class MenuItemKt {
+ ctor public MenuItemKt();
+ method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+ }
+
+ public final class NavControllerKt {
+ ctor public NavControllerKt();
+ method public static boolean navigateUp(androidx.navigation.NavController, android.support.v4.widget.DrawerLayout? drawerLayout);
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+ }
+
+ public final class NavigationViewKt {
+ ctor public NavigationViewKt();
+ method public static void setupWithNavController(android.support.design.widget.NavigationView, androidx.navigation.NavController navController);
+ }
+
+ public final class ToolbarKt {
+ ctor public ToolbarKt();
+ method public static void setupWithNavController(android.support.v7.widget.Toolbar, androidx.navigation.NavController navController, android.support.v4.widget.DrawerLayout? drawerLayout);
+ method public static void setupWithNavController(android.support.v7.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/navigation/ui/ktx/api/res-1.0.0-beta02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to navigation/ui/ktx/api/res-1.0.0-beta02.txt
diff --git a/paging/common/build.gradle b/paging/common/build.gradle
index b76372c..68f9627 100644
--- a/paging/common/build.gradle
+++ b/paging/common/build.gradle
@@ -29,7 +29,7 @@
}
dependencies {
- compile(SUPPORT_ANNOTATIONS)
+ compile(project(":annotation"))
compile(ARCH_CORE_COMMON)
testCompile(JUNIT)
diff --git a/paging/common/src/main/java/androidx/paging/PagedList.java b/paging/common/src/main/java/androidx/paging/PagedList.java
index 9070301..be9079c 100644
--- a/paging/common/src/main/java/androidx/paging/PagedList.java
+++ b/paging/common/src/main/java/androidx/paging/PagedList.java
@@ -760,7 +760,7 @@
}
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
void offsetAccessIndices(int offset) {
// update last loadAround index
mLastLoad += offset;
diff --git a/paging/common/src/main/java/androidx/paging/TiledDataSource.java b/paging/common/src/main/java/androidx/paging/TiledDataSource.java
index 5f86421..7c45879 100644
--- a/paging/common/src/main/java/androidx/paging/TiledDataSource.java
+++ b/paging/common/src/main/java/androidx/paging/TiledDataSource.java
@@ -34,7 +34,7 @@
*/
@SuppressWarnings("DeprecatedIsStillUsed")
@Deprecated
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class TiledDataSource<T> extends PositionalDataSource<T> {
@WorkerThread
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 3b09dcf..cd9287f 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -33,9 +33,9 @@
dependencies {
api(project(":paging:paging-common"))
- api(ARCH_CORE_RUNTIME)
+ api(project(":arch:core-runtime"))
api(ARCH_LIFECYCLE_RUNTIME)
- api(ARCH_LIFECYCLE_LIVEDATA)
+ api(project(":lifecycle:lifecycle-livedata"))
api(ANDROIDX_RECYCLERVIEW, libs.support_exclude_config)
androidTestImplementation(JUNIT)
diff --git a/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
index a08415d..07e0bac 100644
--- a/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
@@ -16,7 +16,6 @@
package androidx.paging
-import android.annotation.SuppressLint
import androidx.arch.core.executor.ArchTaskExecutor
import androidx.lifecycle.LiveData
import java.util.concurrent.Executor
@@ -35,7 +34,6 @@
*
* @see LivePagedListBuilder
*/
-@SuppressLint("RestrictedApi")
fun <Key, Value> DataSource.Factory<Key, Value>.toLiveData(
config: PagedList.Config,
initialLoadKey: Key? = null,
@@ -63,7 +61,6 @@
*
* @see LivePagedListBuilder
*/
-@SuppressLint("RestrictedApi")
fun <Key, Value> DataSource.Factory<Key, Value>.toLiveData(
pageSize: Int,
initialLoadKey: Key? = null,
diff --git a/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.java b/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.java
index c456965..54dbe04 100644
--- a/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.java
+++ b/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.java
@@ -123,7 +123,6 @@
@SuppressWarnings("WeakerAccess") /* synthetic access */
final AsyncDifferConfig<T> mConfig;
- @SuppressWarnings("RestrictedApi")
Executor mMainThreadExecutor = ArchTaskExecutor.getMainThreadExecutor();
/**
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedListBuilder.java b/paging/runtime/src/main/java/androidx/paging/LivePagedListBuilder.java
index 481619d..44c8c926 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedListBuilder.java
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedListBuilder.java
@@ -16,7 +16,6 @@
package androidx.paging;
-import android.annotation.SuppressLint;
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
@@ -43,7 +42,6 @@
private PagedList.Config mConfig;
private DataSource.Factory<Key, Value> mDataSourceFactory;
private PagedList.BoundaryCallback mBoundaryCallback;
- @SuppressLint("RestrictedApi")
private Executor mFetchExecutor = ArchTaskExecutor.getIOThreadExecutor();
/**
@@ -152,7 +150,6 @@
* @return The LiveData of PagedLists
*/
@NonNull
- @SuppressLint("RestrictedApi")
public LiveData<PagedList<Value>> build() {
return create(mInitialLoadKey, mConfig, mBoundaryCallback, mDataSourceFactory,
ArchTaskExecutor.getMainThreadExecutor(), mFetchExecutor);
@@ -160,7 +157,6 @@
@AnyThread
@NonNull
- @SuppressLint("RestrictedApi")
private static <Key, Value> LiveData<PagedList<Value>> create(
@Nullable final Key initialLoadKey,
@NonNull final PagedList.Config config,
diff --git a/paging/rxjava2/build.gradle b/paging/rxjava2/build.gradle
index ac29079..64d5e83 100644
--- a/paging/rxjava2/build.gradle
+++ b/paging/rxjava2/build.gradle
@@ -33,7 +33,7 @@
dependencies {
api(project(":paging:paging-common"))
- api(ARCH_CORE_RUNTIME)
+ api(project(":arch:core-runtime"))
api(RX_JAVA)
androidTestImplementation(JUNIT)
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
index b364dc8..20f124b 100644
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
@@ -16,7 +16,6 @@
package androidx.paging;
-import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -209,7 +208,6 @@
* @return The Observable of PagedLists
*/
@NonNull
- @SuppressLint("RestrictedApi")
public Observable<PagedList<Value>> buildObservable() {
if (mNotifyExecutor == null) {
mNotifyExecutor = ArchTaskExecutor.getMainThreadExecutor();
diff --git a/percent/api/1.1.0-alpha01.txt b/percent/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..13744ae
--- /dev/null
+++ b/percent/api/1.1.0-alpha01.txt
@@ -0,0 +1,71 @@
+// Signature format: 3.0
+package androidx.percentlayout.widget {
+
+ @Deprecated public class PercentFrameLayout extends android.widget.FrameLayout {
+ ctor @Deprecated public PercentFrameLayout(android.content.Context!);
+ ctor @Deprecated public PercentFrameLayout(android.content.Context!, android.util.AttributeSet!);
+ ctor @Deprecated public PercentFrameLayout(android.content.Context!, android.util.AttributeSet!, int);
+ method @Deprecated protected androidx.percentlayout.widget.PercentFrameLayout.LayoutParams! generateDefaultLayoutParams();
+ method @Deprecated public androidx.percentlayout.widget.PercentFrameLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ }
+
+ @Deprecated public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements androidx.percentlayout.widget.PercentLayoutHelper.PercentLayoutParams {
+ ctor @Deprecated public PercentFrameLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor @Deprecated public PercentFrameLayout.LayoutParams(int, int);
+ ctor @Deprecated public PercentFrameLayout.LayoutParams(int, int, int);
+ ctor @Deprecated public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor @Deprecated public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor @Deprecated public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams!);
+ ctor @Deprecated @RequiresApi(19) public PercentFrameLayout.LayoutParams(androidx.percentlayout.widget.PercentFrameLayout.LayoutParams!);
+ method @Deprecated public androidx.percentlayout.widget.PercentLayoutHelper.PercentLayoutInfo! getPercentLayoutInfo();
+ }
+
+ @Deprecated public class PercentLayoutHelper {
+ ctor @Deprecated public PercentLayoutHelper(android.view.ViewGroup);
+ method @Deprecated public void adjustChildren(int, int);
+ method @Deprecated public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams!, android.content.res.TypedArray!, int, int);
+ method @Deprecated public static androidx.percentlayout.widget.PercentLayoutHelper.PercentLayoutInfo! getPercentLayoutInfo(android.content.Context!, android.util.AttributeSet!);
+ method @Deprecated public boolean handleMeasuredStateTooSmall();
+ method @Deprecated public void restoreOriginalParams();
+ }
+
+ @Deprecated public static class PercentLayoutHelper.PercentLayoutInfo {
+ ctor @Deprecated public PercentLayoutHelper.PercentLayoutInfo();
+ method @Deprecated public void fillLayoutParams(android.view.ViewGroup.LayoutParams!, int, int);
+ method @Deprecated public void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams!, int, int);
+ method @Deprecated public void fillMarginLayoutParams(android.view.View!, android.view.ViewGroup.MarginLayoutParams!, int, int);
+ method @Deprecated public void restoreLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @Deprecated public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ field @Deprecated public float aspectRatio;
+ field @Deprecated public float bottomMarginPercent;
+ field @Deprecated public float endMarginPercent;
+ field @Deprecated public float heightPercent;
+ field @Deprecated public float leftMarginPercent;
+ field @Deprecated public float rightMarginPercent;
+ field @Deprecated public float startMarginPercent;
+ field @Deprecated public float topMarginPercent;
+ field @Deprecated public float widthPercent;
+ }
+
+ @Deprecated public static interface PercentLayoutHelper.PercentLayoutParams {
+ method @Deprecated public androidx.percentlayout.widget.PercentLayoutHelper.PercentLayoutInfo! getPercentLayoutInfo();
+ }
+
+ @Deprecated public class PercentRelativeLayout extends android.widget.RelativeLayout {
+ ctor @Deprecated public PercentRelativeLayout(android.content.Context!);
+ ctor @Deprecated public PercentRelativeLayout(android.content.Context!, android.util.AttributeSet!);
+ ctor @Deprecated public PercentRelativeLayout(android.content.Context!, android.util.AttributeSet!, int);
+ method @Deprecated protected androidx.percentlayout.widget.PercentRelativeLayout.LayoutParams! generateDefaultLayoutParams();
+ method @Deprecated public androidx.percentlayout.widget.PercentRelativeLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ }
+
+ @Deprecated public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements androidx.percentlayout.widget.PercentLayoutHelper.PercentLayoutParams {
+ ctor @Deprecated public PercentRelativeLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor @Deprecated public PercentRelativeLayout.LayoutParams(int, int);
+ ctor @Deprecated public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor @Deprecated public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ method @Deprecated public androidx.percentlayout.widget.PercentLayoutHelper.PercentLayoutInfo! getPercentLayoutInfo();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/percent/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to percent/api/res-1.1.0-alpha01.txt
diff --git a/preference/api/1.1.0-alpha04.txt b/preference/api/1.1.0-alpha04.txt
new file mode 100644
index 0000000..d3b0755
--- /dev/null
+++ b/preference/api/1.1.0-alpha04.txt
@@ -0,0 +1,539 @@
+// Signature format: 3.0
+package androidx.preference {
+
+ public class CheckBoxPreference extends androidx.preference.TwoStatePreference {
+ ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public CheckBoxPreference(android.content.Context!);
+ }
+
+ public abstract class DialogPreference extends androidx.preference.Preference {
+ ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public DialogPreference(android.content.Context!);
+ method public android.graphics.drawable.Drawable! getDialogIcon();
+ method public int getDialogLayoutResource();
+ method public CharSequence! getDialogMessage();
+ method public CharSequence! getDialogTitle();
+ method public CharSequence! getNegativeButtonText();
+ method public CharSequence! getPositiveButtonText();
+ method public void setDialogIcon(android.graphics.drawable.Drawable!);
+ method public void setDialogIcon(int);
+ method public void setDialogLayoutResource(int);
+ method public void setDialogMessage(CharSequence!);
+ method public void setDialogMessage(int);
+ method public void setDialogTitle(CharSequence!);
+ method public void setDialogTitle(int);
+ method public void setNegativeButtonText(CharSequence!);
+ method public void setNegativeButtonText(int);
+ method public void setPositiveButtonText(CharSequence!);
+ method public void setPositiveButtonText(int);
+ }
+
+ public static interface DialogPreference.TargetFragment {
+ method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
+ }
+
+ public class DropDownPreference extends androidx.preference.ListPreference {
+ ctor public DropDownPreference(android.content.Context!);
+ ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ method protected android.widget.ArrayAdapter! createAdapter();
+ }
+
+ public class EditTextPreference extends androidx.preference.DialogPreference {
+ ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public EditTextPreference(android.content.Context!);
+ method public androidx.preference.EditTextPreference.OnBindEditTextListener? getOnBindEditTextListener();
+ method public String! getText();
+ method public void setOnBindEditTextListener(androidx.preference.EditTextPreference.OnBindEditTextListener?);
+ method public void setText(String!);
+ }
+
+ public static interface EditTextPreference.OnBindEditTextListener {
+ method public void onBindEditText(android.widget.EditText);
+ }
+
+ public static final class EditTextPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.EditTextPreference> {
+ method public static androidx.preference.EditTextPreference.SimpleSummaryProvider! getInstance();
+ method public CharSequence! provideSummary(androidx.preference.EditTextPreference!);
+ }
+
+ @Deprecated public class EditTextPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
+ ctor @Deprecated public EditTextPreferenceDialogFragment();
+ method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment! newInstance(String!);
+ method @Deprecated protected void onBindDialogView(android.view.View!);
+ method @Deprecated public void onDialogClosed(boolean);
+ }
+
+ public class EditTextPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
+ ctor public EditTextPreferenceDialogFragmentCompat();
+ method public static androidx.preference.EditTextPreferenceDialogFragmentCompat! newInstance(String!);
+ method public void onDialogClosed(boolean);
+ }
+
+ public class ListPreference extends androidx.preference.DialogPreference {
+ ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public ListPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public ListPreference(android.content.Context!);
+ method public int findIndexOfValue(String!);
+ method public CharSequence[]! getEntries();
+ method public CharSequence! getEntry();
+ method public CharSequence[]! getEntryValues();
+ method public String! getValue();
+ method public void setEntries(CharSequence[]!);
+ method public void setEntries(@ArrayRes int);
+ method public void setEntryValues(CharSequence[]!);
+ method public void setEntryValues(@ArrayRes int);
+ method public void setValue(String!);
+ method public void setValueIndex(int);
+ }
+
+ public static final class ListPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.ListPreference> {
+ method public static androidx.preference.ListPreference.SimpleSummaryProvider! getInstance();
+ method public CharSequence! provideSummary(androidx.preference.ListPreference!);
+ }
+
+ @Deprecated public class ListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
+ ctor @Deprecated public ListPreferenceDialogFragment();
+ method @Deprecated public static androidx.preference.ListPreferenceDialogFragment! newInstance(String!);
+ method @Deprecated public void onDialogClosed(boolean);
+ method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+ }
+
+ public class ListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
+ ctor public ListPreferenceDialogFragmentCompat();
+ method public static androidx.preference.ListPreferenceDialogFragmentCompat! newInstance(String!);
+ method public void onDialogClosed(boolean);
+ }
+
+ public class MultiSelectListPreference extends androidx.preference.DialogPreference {
+ ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public MultiSelectListPreference(android.content.Context!);
+ method public int findIndexOfValue(String!);
+ method public CharSequence[]! getEntries();
+ method public CharSequence[]! getEntryValues();
+ method protected boolean[]! getSelectedItems();
+ method public java.util.Set<java.lang.String>! getValues();
+ method public void setEntries(CharSequence[]!);
+ method public void setEntries(@ArrayRes int);
+ method public void setEntryValues(CharSequence[]!);
+ method public void setEntryValues(@ArrayRes int);
+ method public void setValues(java.util.Set<java.lang.String>!);
+ }
+
+ @Deprecated public class MultiSelectListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
+ ctor @Deprecated public MultiSelectListPreferenceDialogFragment();
+ method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment! newInstance(String!);
+ method @Deprecated public void onDialogClosed(boolean);
+ method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+ }
+
+ public class MultiSelectListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
+ ctor public MultiSelectListPreferenceDialogFragmentCompat();
+ method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat! newInstance(String!);
+ method public void onDialogClosed(boolean);
+ }
+
+ public class Preference implements java.lang.Comparable<androidx.preference.Preference> {
+ ctor public Preference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public Preference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public Preference(android.content.Context!, android.util.AttributeSet!);
+ ctor public Preference(android.content.Context!);
+ method public boolean callChangeListener(Object!);
+ method public int compareTo(androidx.preference.Preference);
+ method protected <T extends androidx.preference.Preference> T? findPreferenceInHierarchy(String);
+ method public android.content.Context! getContext();
+ method public String! getDependency();
+ method public android.os.Bundle! getExtras();
+ method public String! getFragment();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public String! getKey();
+ method public final int getLayoutResource();
+ method public androidx.preference.Preference.OnPreferenceChangeListener! getOnPreferenceChangeListener();
+ method public androidx.preference.Preference.OnPreferenceClickListener! getOnPreferenceClickListener();
+ method public int getOrder();
+ method public androidx.preference.PreferenceGroup? getParent();
+ method protected boolean getPersistedBoolean(boolean);
+ method protected float getPersistedFloat(float);
+ method protected int getPersistedInt(int);
+ method protected long getPersistedLong(long);
+ method protected String! getPersistedString(String!);
+ method public java.util.Set<java.lang.String>! getPersistedStringSet(java.util.Set<java.lang.String>!);
+ method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
+ method public androidx.preference.PreferenceManager! getPreferenceManager();
+ method public android.content.SharedPreferences! getSharedPreferences();
+ method public boolean getShouldDisableView();
+ method public CharSequence! getSummary();
+ method public final androidx.preference.Preference.SummaryProvider? getSummaryProvider();
+ method public CharSequence! getTitle();
+ method public final int getWidgetLayoutResource();
+ method public boolean hasKey();
+ method public boolean isCopyingEnabled();
+ method public boolean isEnabled();
+ method public boolean isIconSpaceReserved();
+ method public boolean isPersistent();
+ method public boolean isSelectable();
+ method public final boolean isShown();
+ method public boolean isSingleLineTitle();
+ method public final boolean isVisible();
+ method protected void notifyChanged();
+ method public void notifyDependencyChange(boolean);
+ method protected void notifyHierarchyChanged();
+ method public void onAttached();
+ method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager!);
+ method public void onBindViewHolder(androidx.preference.PreferenceViewHolder!);
+ method protected void onClick();
+ method public void onDependencyChanged(androidx.preference.Preference!, boolean);
+ method public void onDetached();
+ method protected Object! onGetDefaultValue(android.content.res.TypedArray!, int);
+ method @CallSuper public void onInitializeAccessibilityNodeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public void onParentChanged(androidx.preference.Preference!, boolean);
+ method protected void onPrepareForRemoval();
+ method protected void onRestoreInstanceState(android.os.Parcelable!);
+ method protected android.os.Parcelable! onSaveInstanceState();
+ method @Deprecated protected void onSetInitialValue(boolean, Object!);
+ method protected void onSetInitialValue(Object?);
+ method public android.os.Bundle! peekExtras();
+ method protected boolean persistBoolean(boolean);
+ method protected boolean persistFloat(float);
+ method protected boolean persistInt(int);
+ method protected boolean persistLong(long);
+ method protected boolean persistString(String!);
+ method public boolean persistStringSet(java.util.Set<java.lang.String>!);
+ method public void restoreHierarchyState(android.os.Bundle!);
+ method public void saveHierarchyState(android.os.Bundle!);
+ method public void setCopyingEnabled(boolean);
+ method public void setDefaultValue(Object!);
+ method public void setDependency(String!);
+ method public void setEnabled(boolean);
+ method public void setFragment(String!);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIcon(int);
+ method public void setIconSpaceReserved(boolean);
+ method public void setIntent(android.content.Intent!);
+ method public void setKey(String!);
+ method public void setLayoutResource(int);
+ method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener!);
+ method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener!);
+ method public void setOrder(int);
+ method public void setPersistent(boolean);
+ method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+ method public void setSelectable(boolean);
+ method public void setShouldDisableView(boolean);
+ method public void setSingleLineTitle(boolean);
+ method public void setSummary(CharSequence!);
+ method public void setSummary(int);
+ method public final void setSummaryProvider(androidx.preference.Preference.SummaryProvider?);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ method public void setViewId(int);
+ method public final void setVisible(boolean);
+ method public void setWidgetLayoutResource(int);
+ method public boolean shouldDisableDependents();
+ method protected boolean shouldPersist();
+ field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
+ }
+
+ public static class Preference.BaseSavedState extends android.view.AbsSavedState {
+ ctor public Preference.BaseSavedState(android.os.Parcel!);
+ ctor public Preference.BaseSavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState>! CREATOR;
+ }
+
+ public static interface Preference.OnPreferenceChangeListener {
+ method public boolean onPreferenceChange(androidx.preference.Preference!, Object!);
+ }
+
+ public static interface Preference.OnPreferenceClickListener {
+ method public boolean onPreferenceClick(androidx.preference.Preference!);
+ }
+
+ public static interface Preference.SummaryProvider<T extends androidx.preference.Preference> {
+ method public CharSequence! provideSummary(T!);
+ }
+
+ public class PreferenceCategory extends androidx.preference.PreferenceGroup {
+ ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!);
+ ctor public PreferenceCategory(android.content.Context!);
+ }
+
+ public abstract class PreferenceDataStore {
+ ctor public PreferenceDataStore();
+ method public boolean getBoolean(String!, boolean);
+ method public float getFloat(String!, float);
+ method public int getInt(String!, int);
+ method public long getLong(String!, long);
+ method public String? getString(String!, String?);
+ method public java.util.Set<java.lang.String>? getStringSet(String!, java.util.Set<java.lang.String>?);
+ method public void putBoolean(String!, boolean);
+ method public void putFloat(String!, float);
+ method public void putInt(String!, int);
+ method public void putLong(String!, long);
+ method public void putString(String!, String?);
+ method public void putStringSet(String!, java.util.Set<java.lang.String>?);
+ }
+
+ @Deprecated public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+ ctor @Deprecated public PreferenceDialogFragment();
+ method @Deprecated public androidx.preference.DialogPreference! getPreference();
+ method @Deprecated protected void onBindDialogView(android.view.View!);
+ method @Deprecated public void onClick(android.content.DialogInterface!, int);
+ method @Deprecated protected android.view.View! onCreateDialogView(android.content.Context!);
+ method @Deprecated public abstract void onDialogClosed(boolean);
+ method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+ field @Deprecated protected static final String ARG_KEY = "key";
+ }
+
+ public abstract class PreferenceDialogFragmentCompat extends androidx.fragment.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+ ctor public PreferenceDialogFragmentCompat();
+ method public androidx.preference.DialogPreference! getPreference();
+ method protected void onBindDialogView(android.view.View!);
+ method public void onClick(android.content.DialogInterface!, int);
+ method protected android.view.View! onCreateDialogView(android.content.Context!);
+ method public abstract void onDialogClosed(boolean);
+ method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder!);
+ field protected static final String ARG_KEY = "key";
+ }
+
+ @Deprecated public abstract class PreferenceFragment extends android.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
+ ctor @Deprecated public PreferenceFragment();
+ method @Deprecated public void addPreferencesFromResource(@XmlRes int);
+ method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+ method @Deprecated public final androidx.recyclerview.widget.RecyclerView! getListView();
+ method @Deprecated public androidx.preference.PreferenceManager! getPreferenceManager();
+ method @Deprecated public androidx.preference.PreferenceScreen! getPreferenceScreen();
+ method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
+ method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
+ method @Deprecated public abstract void onCreatePreferences(android.os.Bundle!, String!);
+ method @Deprecated public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference!);
+ method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
+ method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+ method @Deprecated public void scrollToPreference(String!);
+ method @Deprecated public void scrollToPreference(androidx.preference.Preference!);
+ method @Deprecated public void setDivider(android.graphics.drawable.Drawable!);
+ method @Deprecated public void setDividerHeight(int);
+ method @Deprecated public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
+ method @Deprecated public void setPreferencesFromResource(@XmlRes int, String?);
+ field @Deprecated public static final String ARG_PREFERENCE_ROOT = "androidx.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+ }
+
+ @Deprecated public static interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
+ method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference!);
+ }
+
+ @Deprecated public static interface PreferenceFragment.OnPreferenceStartFragmentCallback {
+ method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment!, androidx.preference.Preference!);
+ }
+
+ @Deprecated public static interface PreferenceFragment.OnPreferenceStartScreenCallback {
+ method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment!, androidx.preference.PreferenceScreen!);
+ }
+
+ public abstract class PreferenceFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
+ ctor public PreferenceFragmentCompat();
+ method public void addPreferencesFromResource(@XmlRes int);
+ method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
+ method public final androidx.recyclerview.widget.RecyclerView! getListView();
+ method public androidx.preference.PreferenceManager! getPreferenceManager();
+ method public androidx.preference.PreferenceScreen! getPreferenceScreen();
+ method protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
+ method public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
+ method public abstract void onCreatePreferences(android.os.Bundle!, String!);
+ method public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+ method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
+ method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
+ method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+ method public void scrollToPreference(String!);
+ method public void scrollToPreference(androidx.preference.Preference!);
+ method public void setDivider(android.graphics.drawable.Drawable!);
+ method public void setDividerHeight(int);
+ method public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
+ method public void setPreferencesFromResource(@XmlRes int, String?);
+ field public static final String ARG_PREFERENCE_ROOT = "androidx.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+ }
+
+ public static interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
+ method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference!);
+ }
+
+ public static interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+ method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat!, androidx.preference.Preference!);
+ }
+
+ public static interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+ method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat!, androidx.preference.PreferenceScreen!);
+ }
+
+ public abstract class PreferenceGroup extends androidx.preference.Preference {
+ ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!);
+ method public void addItemFromInflater(androidx.preference.Preference!);
+ method public boolean addPreference(androidx.preference.Preference!);
+ method protected void dispatchRestoreInstanceState(android.os.Bundle!);
+ method protected void dispatchSaveInstanceState(android.os.Bundle!);
+ method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
+ method public int getInitialExpandedChildrenCount();
+ method public androidx.preference.Preference! getPreference(int);
+ method public int getPreferenceCount();
+ method protected boolean isOnSameScreenAsChildren();
+ method public boolean isOrderingAsAdded();
+ method protected boolean onPrepareAddPreference(androidx.preference.Preference!);
+ method public void removeAll();
+ method public boolean removePreference(androidx.preference.Preference!);
+ method public boolean removePreferenceRecursively(CharSequence);
+ method public void setInitialExpandedChildrenCount(int);
+ method public void setOrderingAsAdded(boolean);
+ }
+
+ public static interface PreferenceGroup.PreferencePositionCallback {
+ method public int getPreferenceAdapterPosition(String!);
+ method public int getPreferenceAdapterPosition(androidx.preference.Preference!);
+ }
+
+ public class PreferenceManager {
+ method public androidx.preference.PreferenceScreen! createPreferenceScreen(android.content.Context!);
+ method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
+ method public android.content.Context! getContext();
+ method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context!);
+ method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener! getOnDisplayPreferenceDialogListener();
+ method public androidx.preference.PreferenceManager.OnNavigateToScreenListener! getOnNavigateToScreenListener();
+ method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener! getOnPreferenceTreeClickListener();
+ method public androidx.preference.PreferenceManager.PreferenceComparisonCallback! getPreferenceComparisonCallback();
+ method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
+ method public androidx.preference.PreferenceScreen! getPreferenceScreen();
+ method public android.content.SharedPreferences! getSharedPreferences();
+ method public int getSharedPreferencesMode();
+ method public String! getSharedPreferencesName();
+ method public boolean isStorageDefault();
+ method public boolean isStorageDeviceProtected();
+ method public static void setDefaultValues(android.content.Context!, int, boolean);
+ method public static void setDefaultValues(android.content.Context!, String!, int, int, boolean);
+ method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener!);
+ method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener!);
+ method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener!);
+ method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback!);
+ method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+ method public boolean setPreferences(androidx.preference.PreferenceScreen!);
+ method public void setSharedPreferencesMode(int);
+ method public void setSharedPreferencesName(String!);
+ method public void setStorageDefault();
+ method public void setStorageDeviceProtected();
+ method public void showDialog(androidx.preference.Preference!);
+ field public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
+ }
+
+ public static interface PreferenceManager.OnDisplayPreferenceDialogListener {
+ method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
+ }
+
+ public static interface PreferenceManager.OnNavigateToScreenListener {
+ method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
+ }
+
+ public static interface PreferenceManager.OnPreferenceTreeClickListener {
+ method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+ }
+
+ public abstract static class PreferenceManager.PreferenceComparisonCallback {
+ ctor public PreferenceManager.PreferenceComparisonCallback();
+ method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+ method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+ }
+
+ public static class PreferenceManager.SimplePreferenceComparisonCallback extends androidx.preference.PreferenceManager.PreferenceComparisonCallback {
+ ctor public PreferenceManager.SimplePreferenceComparisonCallback();
+ method public boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+ method public boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+ }
+
+ public final class PreferenceScreen extends androidx.preference.PreferenceGroup {
+ method public void setShouldUseGeneratedIds(boolean);
+ method public boolean shouldUseGeneratedIds();
+ }
+
+ public class PreferenceViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder {
+ method public android.view.View! findViewById(@IdRes int);
+ method public boolean isDividerAllowedAbove();
+ method public boolean isDividerAllowedBelow();
+ method public void setDividerAllowedAbove(boolean);
+ method public void setDividerAllowedBelow(boolean);
+ }
+
+ public class SeekBarPreference extends androidx.preference.Preference {
+ ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public SeekBarPreference(android.content.Context!);
+ method public int getMax();
+ method public int getMin();
+ method public final int getSeekBarIncrement();
+ method public int getValue();
+ method public boolean isAdjustable();
+ method public void setAdjustable(boolean);
+ method public final void setMax(int);
+ method public void setMin(int);
+ method public final void setSeekBarIncrement(int);
+ method public void setValue(int);
+ }
+
+ public class SwitchPreference extends androidx.preference.TwoStatePreference {
+ ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public SwitchPreference(android.content.Context!);
+ method public CharSequence! getSwitchTextOff();
+ method public CharSequence! getSwitchTextOn();
+ method public void setSwitchTextOff(CharSequence!);
+ method public void setSwitchTextOff(int);
+ method public void setSwitchTextOn(CharSequence!);
+ method public void setSwitchTextOn(int);
+ }
+
+ public class SwitchPreferenceCompat extends androidx.preference.TwoStatePreference {
+ ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!);
+ ctor public SwitchPreferenceCompat(android.content.Context!);
+ method public CharSequence! getSwitchTextOff();
+ method public CharSequence! getSwitchTextOn();
+ method public void setSwitchTextOff(CharSequence!);
+ method public void setSwitchTextOff(int);
+ method public void setSwitchTextOn(CharSequence!);
+ method public void setSwitchTextOn(int);
+ }
+
+ public abstract class TwoStatePreference extends androidx.preference.Preference {
+ ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!);
+ ctor public TwoStatePreference(android.content.Context!);
+ method public boolean getDisableDependentsState();
+ method public CharSequence! getSummaryOff();
+ method public CharSequence! getSummaryOn();
+ method public boolean isChecked();
+ method public void setChecked(boolean);
+ method public void setDisableDependentsState(boolean);
+ method public void setSummaryOff(CharSequence!);
+ method public void setSummaryOff(int);
+ method public void setSummaryOn(CharSequence!);
+ method public void setSummaryOn(int);
+ method protected void syncSummaryView(androidx.preference.PreferenceViewHolder!);
+ field protected boolean mChecked;
+ }
+
+}
+
diff --git a/preference/api/res-1.1.0-alpha04.txt b/preference/api/res-1.1.0-alpha04.txt
new file mode 100644
index 0000000..f55c31a
--- /dev/null
+++ b/preference/api/res-1.1.0-alpha04.txt
@@ -0,0 +1,77 @@
+style Preference
+style Preference_Category
+style Preference_CheckBoxPreference
+style Preference_DialogPreference
+style Preference_DialogPreference_EditTextPreference
+style Preference_DropDown
+style Preference_Information
+style Preference_PreferenceScreen
+style Preference_SeekBarPreference
+style Preference_SwitchPreferenceCompat
+style PreferenceFragment
+style PreferenceFragmentList
+style PreferenceThemeOverlay
+attr adjustable
+attr allowDividerAbove
+attr allowDividerAfterLastItem
+attr allowDividerBelow
+attr checkBoxPreferenceStyle
+attr defaultValue
+attr dependency
+attr dialogIcon
+attr dialogLayout
+attr dialogMessage
+attr dialogPreferenceStyle
+attr dialogTitle
+attr disableDependentsState
+attr dropdownPreferenceStyle
+attr editTextPreferenceStyle
+attr enabled
+attr entries
+attr entryValues
+attr fragment
+attr icon
+attr iconSpaceReserved
+attr key
+attr layout
+attr maxHeight
+attr maxWidth
+attr min
+attr negativeButtonText
+attr order
+attr orderingFromXml
+attr persistent
+attr positiveButtonText
+attr preferenceActivityStyle
+attr preferenceCategoryStyle
+attr preferenceCategoryTitleTextAppearance
+attr preferenceFragmentCompatStyle
+attr preferenceFragmentListStyle
+attr preferenceFragmentPaddingSide
+attr preferenceFragmentStyle
+attr preferenceHeaderPanelStyle
+attr preferenceInformationStyle
+attr preferenceLayoutChild
+attr preferenceListStyle
+attr preferencePanelStyle
+attr preferenceScreenStyle
+attr preferenceStyle
+attr preferenceTheme
+attr ringtonePreferenceStyle
+attr seekBarIncrement
+attr seekBarPreferenceStyle
+attr selectable
+attr selectableItemBackground
+attr shouldDisableView
+attr showSeekBarValue
+attr singleLineTitle
+attr summary
+attr summaryOff
+attr summaryOn
+attr switchPreferenceCompatStyle
+attr switchPreferenceStyle
+attr switchTextOff
+attr switchTextOn
+attr title
+attr widgetLayout
+attr yesNoPreferenceStyle
diff --git a/preference/build.gradle b/preference/build.gradle
index 1f750ef..3eed07a 100644
--- a/preference/build.gradle
+++ b/preference/build.gradle
@@ -23,13 +23,11 @@
}
dependencies {
- // TODO: change to 1.1.0-alpha02 after release
- api(project(":appcompat"))
- // TODO: change to 1.1.0-alpha04 after release
+ api(project(":annotation"))
+ api("androidx.appcompat:appcompat:1.1.0-alpha02")
api(project(":core"))
implementation("androidx.collection:collection:1.0.0")
- // TODO: change to 1.1.0-alpha04 after release
- api(project(":fragment"))
+ api("androidx.fragment:fragment:1.1.0-alpha04")
api("androidx.recyclerview:recyclerview:1.0.0")
androidTestImplementation(TEST_EXT_JUNIT)
diff --git a/preference/ktx/api/1.1.0-alpha04.txt b/preference/ktx/api/1.1.0-alpha04.txt
new file mode 100644
index 0000000..236569e
--- /dev/null
+++ b/preference/ktx/api/1.1.0-alpha04.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.preference {
+
+ public final class PreferenceGroupKt {
+ ctor public PreferenceGroupKt();
+ method public static operator boolean contains(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
+ method public static inline void forEach(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function1<? super androidx.preference.Preference,kotlin.Unit> action);
+ method public static inline void forEachIndexed(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.preference.Preference,kotlin.Unit> action);
+ method public static inline operator <T extends androidx.preference.Preference> T? get(androidx.preference.PreferenceGroup, CharSequence key);
+ method public static operator androidx.preference.Preference get(androidx.preference.PreferenceGroup, int index);
+ method public static kotlin.sequences.Sequence<androidx.preference.Preference> getChildren(androidx.preference.PreferenceGroup);
+ method public static inline int getSize(androidx.preference.PreferenceGroup);
+ method public static inline boolean isEmpty(androidx.preference.PreferenceGroup);
+ method public static inline boolean isNotEmpty(androidx.preference.PreferenceGroup);
+ method public static operator java.util.Iterator<androidx.preference.Preference> iterator(androidx.preference.PreferenceGroup);
+ method public static inline operator void minusAssign(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
+ method public static inline operator void plusAssign(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/preference/ktx/api/res-1.1.0-alpha04.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to preference/ktx/api/res-1.1.0-alpha04.txt
diff --git a/preference/ktx/src/androidTest/AndroidManifest.xml b/preference/ktx/src/androidTest/AndroidManifest.xml
index fa8fd40..8cbbccf9 100644
--- a/preference/ktx/src/androidTest/AndroidManifest.xml
+++ b/preference/ktx/src/androidTest/AndroidManifest.xml
@@ -18,6 +18,8 @@
package="androidx.preference.ktx.test">
<uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
<application>
- <activity android:name="androidx.preference.TestPreferenceActivity"/>
+ <activity
+ android:name="androidx.preference.PreferenceTestHelperActivity"
+ android:theme="@style/Theme.AppCompat.NoActionBar"/>
</application>
</manifest>
diff --git a/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt
index 90413c74..2246db6 100644
--- a/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt
+++ b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceGroupTest.kt
@@ -16,6 +16,8 @@
package androidx.preference
+import androidx.preference.ktx.test.R
+import androidx.test.annotation.UiThreadTest
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
@@ -35,19 +37,20 @@
@JvmField
@Rule
- val rule = ActivityTestRule(TestPreferenceActivity::class.java)
+ val rule = ActivityTestRule(PreferenceTestHelperActivity::class.java)
private val context = ApplicationProvider.getApplicationContext() as android.content.Context
private lateinit var preferenceGroup: PreferenceGroup
- @Before fun setup() {
- preferenceGroup = (rule
- .activity
- .supportFragmentManager
- .findFragmentByTag(
- TestPreferenceActivity.TAG) as PreferenceFragmentCompat).preferenceScreen
+ @Before
+ @UiThreadTest
+ fun setup() {
+ preferenceGroup =
+ rule.activity.setupPreferenceHierarchy(R.xml.test_preferencegroup).preferenceScreen
}
- @Test fun get() {
+ @UiThreadTest
+ @Test
+ fun get() {
val key = "key"
val preference = Preference(context)
preference.key = key
@@ -56,7 +59,9 @@
assertSame(preference, preferenceGroup[0])
}
- @Test fun contains() {
+ @UiThreadTest
+ @Test
+ fun contains() {
val preference = Preference(context)
assertFalse(preference in preferenceGroup)
assertTrue(preference !in preferenceGroup)
@@ -68,7 +73,9 @@
assertTrue(preference !in preferenceGroup)
}
- @Test fun plusAssign() {
+ @UiThreadTest
+ @Test
+ fun plusAssign() {
assertEquals(0, preferenceGroup.preferenceCount)
val preference1 = Preference(context)
@@ -82,7 +89,9 @@
assertSame(preference2, preferenceGroup.getPreference(1))
}
- @Test fun minusAssign() {
+ @UiThreadTest
+ @Test
+ fun minusAssign() {
val preference1 = Preference(context)
preferenceGroup.addPreference(preference1)
val preference2 = Preference(context)
@@ -98,7 +107,9 @@
assertEquals(0, preferenceGroup.preferenceCount)
}
- @Test fun size() {
+ @UiThreadTest
+ @Test
+ fun size() {
assertEquals(0, preferenceGroup.size)
val preference = Preference(context)
@@ -109,20 +120,24 @@
assertEquals(0, preferenceGroup.size)
}
- @Test fun isEmpty() {
+ @UiThreadTest
+ @Test
+ fun isEmpty() {
assertTrue(preferenceGroup.isEmpty())
preferenceGroup.addPreference(Preference(context))
assertFalse(preferenceGroup.isEmpty())
}
- @Test fun isNotEmpty() {
+ @UiThreadTest
+ @Test
+ fun isNotEmpty() {
assertFalse(preferenceGroup.isNotEmpty())
preferenceGroup.addPreference(Preference(context))
assertTrue(preferenceGroup.isNotEmpty())
}
- // Temporarily disabled due to b/113042342
- // @Test
+ @UiThreadTest
+ @Test
fun forEach() {
preferenceGroup.forEach {
fail("Empty preference group should not invoke lambda")
@@ -140,7 +155,9 @@
assertThat(preferences).containsExactly(preference1, preference2)
}
- @Test fun forEachIndexed() {
+ @UiThreadTest
+ @Test
+ fun forEachIndexed() {
preferenceGroup.forEach {
fail("Empty preference group should not invoke lambda")
}
@@ -158,7 +175,9 @@
assertThat(preferences).containsExactly(preference1, preference2)
}
- @Test fun iterator() {
+ @UiThreadTest
+ @Test
+ fun iterator() {
val preference1 = Preference(context)
preferenceGroup.addPreference(preference1)
val preference2 = Preference(context)
@@ -175,7 +194,9 @@
}
}
- @Test fun children() {
+ @UiThreadTest
+ @Test
+ fun children() {
val preferences = listOf(Preference(context), Preference(context), Preference(context))
preferences.forEach { preferenceGroup.addPreference(it) }
diff --git a/preference/ktx/src/androidTest/java/androidx/preference/PreferenceTestHelperActivity.kt b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceTestHelperActivity.kt
new file mode 100644
index 0000000..e0cadd0
--- /dev/null
+++ b/preference/ktx/src/androidTest/java/androidx/preference/PreferenceTestHelperActivity.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.preference
+
+import android.os.Bundle
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+
+/**
+ * Helper activity that inflates a preference hierarchy defined in a given XML resource with a
+ * [PreferenceFragmentCompat] to aid testing.
+ */
+class PreferenceTestHelperActivity : AppCompatActivity() {
+
+ /**
+ * Inflates the given XML resource and returns the created PreferenceFragmentCompat.
+ *
+ * @param preferenceLayoutId The XML resource ID to inflate
+ * @return The PreferenceFragmentCompat that contains the inflated hierarchy
+ */
+ fun setupPreferenceHierarchy(@LayoutRes preferenceLayoutId: Int): PreferenceFragmentCompat {
+ val fragment = TestFragment(preferenceLayoutId)
+ supportFragmentManager
+ .beginTransaction()
+ .replace(android.R.id.content, fragment)
+ .commitNow()
+ return fragment
+ }
+
+ class TestFragment internal constructor(private val mPreferenceLayoutId: Int) :
+ PreferenceFragmentCompat() {
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(mPreferenceLayoutId, rootKey)
+ }
+ }
+}
diff --git a/preference/ktx/src/androidTest/java/androidx/preference/TestPreferenceActivity.kt b/preference/ktx/src/androidTest/java/androidx/preference/TestPreferenceActivity.kt
deleted file mode 100644
index e58a16b..0000000
--- a/preference/ktx/src/androidTest/java/androidx/preference/TestPreferenceActivity.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.preference
-
-import android.os.Bundle
-import androidx.fragment.app.FragmentActivity
-import androidx.preference.ktx.test.R
-
-class TestPreferenceActivity : FragmentActivity() {
-
- companion object {
- const val TAG = "TestPreferenceActivity"
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- supportFragmentManager.beginTransaction()
- .add(android.R.id.content, TestPreferenceFragment(), TAG)
- .commitNow()
- }
-
- class TestPreferenceFragment : PreferenceFragmentCompat() {
- override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
- addPreferencesFromResource(R.xml.preferences)
- }
- }
-}
diff --git a/preference/ktx/src/androidTest/res/xml/preferences.xml b/preference/ktx/src/androidTest/res/xml/test_preferencegroup.xml
similarity index 100%
rename from preference/ktx/src/androidTest/res/xml/preferences.xml
rename to preference/ktx/src/androidTest/res/xml/test_preferencegroup.xml
diff --git a/preference/res-public/values/public_attrs.xml b/preference/res-public/values/public_attrs.xml
index c765d7e..a12c6cc 100644
--- a/preference/res-public/values/public_attrs.xml
+++ b/preference/res-public/values/public_attrs.xml
@@ -49,6 +49,7 @@
<public type="attr" name="positiveButtonText" />
<public type="attr" name="preferenceActivityStyle" />
<public type="attr" name="preferenceCategoryStyle" />
+ <public type="attr" name="preferenceCategoryTitleTextAppearance" />
<public type="attr" name="preferenceFragmentCompatStyle" />
<public type="attr" name="preferenceFragmentListStyle" />
<public type="attr" name="preferenceFragmentPaddingSide" />
diff --git a/preference/res/layout/expand_button.xml b/preference/res/layout/expand_button.xml
index b517e99..6bf02a2 100644
--- a/preference/res/layout/expand_button.xml
+++ b/preference/res/layout/expand_button.xml
@@ -20,12 +20,15 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
+ android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+ android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:background="?android:attr/selectableItemBackground"
android:clipToPadding="false"
+ android:focusable="true"
android:baselineAligned="false">
<include layout="@layout/image_frame"/>
@@ -41,6 +44,7 @@
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:ellipsize="marquee"/>
@@ -50,11 +54,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
+ android:layout_alignLeft="@android:id/title"
android:layout_alignStart="@android:id/title"
- android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
android:ellipsize="marquee"
- android:singleLine="true"/>
+ android:singleLine="true"
+ style="@style/PreferenceSummaryTextStyle"/>
</RelativeLayout>
</LinearLayout>
diff --git a/preference/res/layout/preference_widget_seekbar.xml b/preference/res/layout/preference_widget_seekbar.xml
index e9430a2..6cc98be 100644
--- a/preference/res/layout/preference_widget_seekbar.xml
+++ b/preference/res/layout/preference_widget_seekbar.xml
@@ -75,14 +75,14 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
- android:paddingStart="@dimen/preference_seekbar_padding_start"
- android:paddingEnd="@dimen/preference_seekbar_padding_end"
+ android:paddingStart="@dimen/preference_seekbar_padding_horizontal"
+ android:paddingEnd="22dp"
android:focusable="false"
android:clickable="false"
android:background="@null" />
<TextView android:id="@+id/seekbar_value"
- android:layout_width="@dimen/preference_seekbar_value_width"
+ android:layout_width="@dimen/preference_seekbar_value_minWidth"
android:layout_height="match_parent"
android:gravity="right|center_vertical"
android:fontFamily="sans-serif-condensed"
diff --git a/preference/res/layout/preference_widget_seekbar_material.xml b/preference/res/layout/preference_widget_seekbar_material.xml
index dfd7db7..47a48f6 100644
--- a/preference/res/layout/preference_widget_seekbar_material.xml
+++ b/preference/res/layout/preference_widget_seekbar_material.xml
@@ -20,7 +20,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
@@ -33,34 +33,41 @@
<include layout="@layout/image_frame"/>
- <RelativeLayout
- android:layout_width="0dp"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginEnd="8dip"
- android:layout_marginTop="6dip"
- android:layout_marginBottom="6dip"
- android:layout_weight="1"
+ android:orientation="vertical"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp"
android:clipChildren="false"
android:clipToPadding="false">
- <TextView
- android:id="@android:id/title"
+ <RelativeLayout
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceListItem"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"/>
+ android:layout_height="0dp"
+ android:layout_weight="1">
- <TextView
- android:id="@android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@android:id/title"
- android:layout_alignStart="@android:id/title"
- android:textColor="?android:attr/textColorSecondary"
- android:maxLines="4"
- style="@style/PreferenceSummaryTextStyle"/>
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceListItem"
+ android:ellipsize="marquee"/>
+
+ <TextView
+ android:id="@android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@android:id/title"
+ android:layout_alignLeft="@android:id/title"
+ android:layout_alignStart="@android:id/title"
+ android:textAlignment="viewStart"
+ android:textColor="?android:attr/textColorSecondary"
+ android:maxLines="4"
+ style="@style/PreferenceSummaryTextStyle"/>
+
+ </RelativeLayout>
<!-- Using UnPressableLinearLayout as a workaround to disable the pressed state propagation
to the children of this container layout. Otherwise, the animated pressed state will also
@@ -69,30 +76,43 @@
<androidx.preference.UnPressableLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_below="@android:id/summary"
- android:layout_alignStart="@android:id/title"
+ android:gravity="center_vertical"
+ android:paddingRight="16dp"
+ android:paddingEnd="16dp"
android:clipChildren="false"
android:clipToPadding="false">
+ <!-- The total height of the Seekbar widget's area should be 48dp - this allows for an
+ increased touch area so you do not need to exactly tap the thumb to move it. However,
+ setting the Seekbar height directly causes the thumb and seekbar to be misaligned on
+ API 22 and 23 - so instead we just set 15dp padding above and below, to account for the
+ 2dp height of the track, and the 8dp margin above and below the whole Preference. -->
<SeekBar
android:id="@+id/seekbar"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
- android:paddingLeft="@dimen/preference_seekbar_padding_start"
- android:paddingRight="@dimen/preference_seekbar_padding_end"
- android:paddingStart="@dimen/preference_seekbar_padding_start"
- android:paddingEnd="@dimen/preference_seekbar_padding_end"
+ android:paddingLeft="@dimen/preference_seekbar_padding_horizontal"
+ android:paddingRight="@dimen/preference_seekbar_padding_horizontal"
+ android:paddingStart="@dimen/preference_seekbar_padding_horizontal"
+ android:paddingEnd="@dimen/preference_seekbar_padding_horizontal"
+ android:paddingTop="@dimen/preference_seekbar_padding_vertical"
+ android:paddingBottom="@dimen/preference_seekbar_padding_vertical"
android:focusable="false"
android:clickable="false"
android:background="@null"/>
+ <!-- If the value is shown, we reserve a minimum width of 36dp to allow for consistent
+ seekbar width for smaller values. If the value is ~4 or more digits, it will expand
+ into the seekbar width. -->
<TextView
android:id="@+id/seekbar_value"
- android:layout_width="@dimen/preference_seekbar_value_width"
- android:layout_height="match_parent"
- android:gravity="right|center_vertical"
- android:fontFamily="sans-serif-condensed"
+ android:minWidth="@dimen/preference_seekbar_value_minWidth"
+ android:paddingLeft="8dp"
+ android:paddingStart="8dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="right"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceListItem"
android:ellipsize="marquee"
@@ -100,5 +120,5 @@
android:scrollbars="none"/>
</androidx.preference.UnPressableLinearLayout>
- </RelativeLayout>
+ </LinearLayout>
</LinearLayout>
diff --git a/preference/res/values/attrs.xml b/preference/res/values/attrs.xml
index d9f8806..8b1d83c 100644
--- a/preference/res/values/attrs.xml
+++ b/preference/res/values/attrs.xml
@@ -322,7 +322,7 @@
<attr name="adjustable" format="boolean" />
<!-- Flag indicating whether the TextView next to the seekbar that shows the current seekbar
value will be displayed. If true, the view is VISIBLE; if false, the view will be GONE.
- By default, this view is VISIBLE. -->
+ By default, this view is GONE. -->
<attr name="showSeekBarValue" format="boolean" />
</declare-styleable>
diff --git a/preference/res/values/dimens.xml b/preference/res/values/dimens.xml
index 8ffc4f0..403523e 100644
--- a/preference/res/values/dimens.xml
+++ b/preference/res/values/dimens.xml
@@ -4,12 +4,12 @@
This helps in aligning titles when some items have icons and some don't. When space is
at a premium, we don't pre-allocate any space. -->
<dimen name="preference_icon_minWidth">0dp</dimen>
- <!-- The padding at the start of the seekbar view within a SeekBarPreference -->
- <dimen name="preference_seekbar_padding_start">0dp</dimen>
- <!-- The padding at the end of the seekbar view within a SeekBarPreference -->
- <dimen name="preference_seekbar_padding_end">22dp</dimen>
- <!-- The width of the TextView indicating the current value of the SeekBarPreference -->
- <dimen name="preference_seekbar_value_width">36dp</dimen>
+ <!-- The padding at the start and end of the Seekbar within a SeekBarPreference -->
+ <dimen name="preference_seekbar_padding_horizontal">0dp</dimen>
+ <!-- The padding at the top and bottom of the Seekbar within a SeekBarPreference -->
+ <dimen name="preference_seekbar_padding_vertical">15dp</dimen>
+ <!-- The minimum width of the TextView indicating the current value of the SeekBarPreference -->
+ <dimen name="preference_seekbar_value_minWidth">36dp</dimen>
<!-- The padding at the start of the dropdown menu within a DropDownPreference
TODO: Pending UX discussion in b/110975540 - keeping old behaviour for now.-->
<dimen name="preference_dropdown_padding_start">0dp</dimen>
diff --git a/preference/res/values/styles.xml b/preference/res/values/styles.xml
index 8dfe8d1..3eaada8 100644
--- a/preference/res/values/styles.xml
+++ b/preference/res/values/styles.xml
@@ -132,7 +132,7 @@
<style name="Preference.SeekBarPreference.Material">
<item name="android:layout">@layout/preference_widget_seekbar_material</item>
<item name="adjustable">true</item>
- <item name="showSeekBarValue">true</item>
+ <item name="showSeekBarValue">false</item>
<item name="allowDividerAbove">false</item>
<item name="allowDividerBelow">true</item>
<item name="iconSpaceReserved">@bool/config_materialPreferenceIconSpaceReserved</item>
diff --git a/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java b/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java
index fc43eec..f96d68c 100644
--- a/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java
+++ b/preference/src/androidTest/java/androidx/preference/tests/PreferenceVisibilityTest.java
@@ -222,7 +222,7 @@
}
/**
- * A {@link OnHierarchyChangeListener that will count down a provided {@link CountDownLatch}
+ * A {@link OnHierarchyChangeListener} that will count down a provided {@link CountDownLatch}
* to allow tests to wait for the view hierarchy to be updated, and fail the test if the
* hierarchy is updated when it shouldn't be.
*/
diff --git a/preference/src/main/java/androidx/preference/AndroidResources.java b/preference/src/main/java/androidx/preference/AndroidResources.java
index ea04144..8e12be3 100644
--- a/preference/src/main/java/androidx/preference/AndroidResources.java
+++ b/preference/src/main/java/androidx/preference/AndroidResources.java
@@ -16,14 +16,14 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class AndroidResources {
public static final int ANDROID_R_ICON_FRAME = android.R.id.icon_frame;
diff --git a/preference/src/main/java/androidx/preference/CheckBoxPreference.java b/preference/src/main/java/androidx/preference/CheckBoxPreference.java
index b6314d3..bfd13c4 100644
--- a/preference/src/main/java/androidx/preference/CheckBoxPreference.java
+++ b/preference/src/main/java/androidx/preference/CheckBoxPreference.java
@@ -16,9 +16,8 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
@@ -45,7 +44,6 @@
public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
- @SuppressLint("RestrictedApi")
public CheckBoxPreference(
Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -65,7 +63,6 @@
a.recycle();
}
- @SuppressLint("RestrictedApi")
public CheckBoxPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.checkBoxPreferenceStyle,
android.R.attr.checkBoxPreferenceStyle));
@@ -87,7 +84,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void performClick(View view) {
super.performClick(view);
diff --git a/preference/src/main/java/androidx/preference/DialogPreference.java b/preference/src/main/java/androidx/preference/DialogPreference.java
index 059d3ae..057bc81 100644
--- a/preference/src/main/java/androidx/preference/DialogPreference.java
+++ b/preference/src/main/java/androidx/preference/DialogPreference.java
@@ -16,7 +16,6 @@
package androidx.preference;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
@@ -48,7 +47,6 @@
private CharSequence mNegativeButtonText;
private int mDialogLayoutResId;
- @SuppressLint("RestrictedApi")
public DialogPreference(
Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -89,7 +87,6 @@
this(context, attrs, defStyleAttr, 0);
}
- @SuppressLint("RestrictedApi")
public DialogPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
android.R.attr.dialogPreferenceStyle));
diff --git a/preference/src/main/java/androidx/preference/DropDownPreference.java b/preference/src/main/java/androidx/preference/DropDownPreference.java
index c158389..ad9fbf5 100644
--- a/preference/src/main/java/androidx/preference/DropDownPreference.java
+++ b/preference/src/main/java/androidx/preference/DropDownPreference.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -119,7 +119,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public int findSpinnerIndexOfValue(String value) {
CharSequence[] entryValues = getEntryValues();
if (value != null && entryValues != null) {
diff --git a/preference/src/main/java/androidx/preference/EditTextPreference.java b/preference/src/main/java/androidx/preference/EditTextPreference.java
index 98f9cfb..7836c4b 100644
--- a/preference/src/main/java/androidx/preference/EditTextPreference.java
+++ b/preference/src/main/java/androidx/preference/EditTextPreference.java
@@ -16,7 +16,6 @@
package androidx.preference;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
@@ -40,7 +39,6 @@
@Nullable
private OnBindEditTextListener mOnBindEditTextListener;
- @SuppressLint("RestrictedApi")
public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -60,7 +58,6 @@
this(context, attrs, defStyleAttr, 0);
}
- @SuppressLint("RestrictedApi")
public EditTextPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.editTextPreferenceStyle,
AndroidResources.ANDROID_R_EDITTEXT_PREFERENCE_STYLE));
diff --git a/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java b/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
index b9f5089..8deaabb 100644
--- a/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
+++ b/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.view.View;
@@ -94,7 +94,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected boolean needInputMethod() {
// We want the input method to show, if possible, when dialog is displayed
diff --git a/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java b/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java
index 7236e43..6e197f3 100644
--- a/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java
+++ b/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.view.View;
@@ -83,7 +83,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected boolean needInputMethod() {
// We want the input method to show, if possible, when dialog is displayed
diff --git a/preference/src/main/java/androidx/preference/ListPreference.java b/preference/src/main/java/androidx/preference/ListPreference.java
index 99ba692..5b67a8b 100644
--- a/preference/src/main/java/androidx/preference/ListPreference.java
+++ b/preference/src/main/java/androidx/preference/ListPreference.java
@@ -16,7 +16,6 @@
package androidx.preference;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
@@ -46,7 +45,6 @@
private String mSummary;
private boolean mValueSet;
- @SuppressLint("RestrictedApi")
public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -80,7 +78,6 @@
this(context, attrs, defStyleAttr, 0);
}
- @SuppressLint("RestrictedApi")
public ListPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
android.R.attr.dialogPreferenceStyle));
diff --git a/preference/src/main/java/androidx/preference/MultiSelectListPreference.java b/preference/src/main/java/androidx/preference/MultiSelectListPreference.java
index 817e22f..931c9b9 100644
--- a/preference/src/main/java/androidx/preference/MultiSelectListPreference.java
+++ b/preference/src/main/java/androidx/preference/MultiSelectListPreference.java
@@ -16,7 +16,6 @@
package androidx.preference;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
@@ -45,7 +44,6 @@
private CharSequence[] mEntryValues;
private Set<String> mValues = new HashSet<>();
- @SuppressLint("RestrictedApi")
public MultiSelectListPreference(
Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -69,7 +67,6 @@
this(context, attrs, defStyleAttr, 0);
}
- @SuppressLint("RestrictedApi")
public MultiSelectListPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context,
R.attr.dialogPreferenceStyle,
diff --git a/preference/src/main/java/androidx/preference/Preference.java b/preference/src/main/java/androidx/preference/Preference.java
index 930508b..8ac775d 100644
--- a/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/src/main/java/androidx/preference/Preference.java
@@ -17,9 +17,8 @@
package androidx.preference;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
@@ -202,7 +201,6 @@
* theme. Can be 0 to not look for defaults.
* @see #Preference(Context, android.util.AttributeSet)
*/
- @SuppressLint("RestrictedApi")
public Preference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
mContext = context;
@@ -310,7 +308,6 @@
* @param attrs The attributes of the XML tag that is inflating the preference
* @see #Preference(Context, AttributeSet, int)
*/
- @SuppressLint("RestrictedApi")
public Preference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
android.R.attr.preferenceStyle));
@@ -1146,7 +1143,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void performClick(View view) {
performClick();
}
@@ -1156,7 +1153,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void performClick() {
if (!isEnabled()) {
@@ -1300,7 +1297,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void onAttachedToHierarchy(PreferenceManager preferenceManager, long id) {
mId = id;
mHasId = true;
diff --git a/preference/src/main/java/androidx/preference/PreferenceCategory.java b/preference/src/main/java/androidx/preference/PreferenceCategory.java
index 6b94470..258edae 100644
--- a/preference/src/main/java/androidx/preference/PreferenceCategory.java
+++ b/preference/src/main/java/androidx/preference/PreferenceCategory.java
@@ -16,7 +16,6 @@
package androidx.preference;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.os.Build.VERSION_CODES;
@@ -50,7 +49,6 @@
this(context, attrs, defStyleAttr, 0);
}
- @SuppressLint("RestrictedApi")
public PreferenceCategory(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceCategoryStyle,
android.R.attr.preferenceCategoryStyle));
diff --git a/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java b/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java
index 57ba35d..ca73bd2 100644
--- a/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java
+++ b/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -217,7 +217,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected boolean needInputMethod() {
return false;
}
diff --git a/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java b/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java
index f58d1a5..c5ceb93 100644
--- a/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java
+++ b/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Dialog;
import android.content.Context;
@@ -198,7 +198,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected boolean needInputMethod() {
return false;
}
diff --git a/preference/src/main/java/androidx/preference/PreferenceFragment.java b/preference/src/main/java/androidx/preference/PreferenceFragment.java
index de7e8f1..871bde9 100644
--- a/preference/src/main/java/androidx/preference/PreferenceFragment.java
+++ b/preference/src/main/java/androidx/preference/PreferenceFragment.java
@@ -16,9 +16,8 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.app.DialogFragment;
import android.app.Fragment;
import android.content.Context;
@@ -184,7 +183,6 @@
public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);
@Override
- @SuppressLint("RestrictedApi")
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -516,11 +514,11 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void onBindPreferences() {}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void onUnbindPreferences() {}
/**
@@ -647,7 +645,7 @@
* @return The {@link Fragment} to possibly use as a callback
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Fragment getCallbackFragment() {
return null;
}
diff --git a/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java b/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
index 5e22662..cd12ba6 100644
--- a/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
+++ b/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -496,11 +496,11 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void onBindPreferences() {}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void onUnbindPreferences() {}
public final RecyclerView getListView() {
@@ -611,7 +611,7 @@
* @return The {@link Fragment} to possibly use as a callback
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Fragment getCallbackFragment() {
return null;
}
diff --git a/preference/src/main/java/androidx/preference/PreferenceGroup.java b/preference/src/main/java/androidx/preference/PreferenceGroup.java
index 62a609a..491c52b 100644
--- a/preference/src/main/java/androidx/preference/PreferenceGroup.java
+++ b/preference/src/main/java/androidx/preference/PreferenceGroup.java
@@ -16,9 +16,8 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
@@ -78,7 +77,6 @@
}
};
- @SuppressLint("RestrictedApi")
public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -406,7 +404,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isAttached() {
return mAttachedToHierarchy;
}
@@ -418,7 +416,7 @@
* @see #setInitialExpandedChildrenCount(int)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void setOnExpandButtonClickListener(
@Nullable OnExpandButtonClickListener onExpandButtonClickListener) {
mOnExpandButtonClickListener = onExpandButtonClickListener;
@@ -430,7 +428,7 @@
* @return The callback to be invoked when the expand button is clicked.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Nullable
public OnExpandButtonClickListener getOnExpandButtonClickListener() {
return mOnExpandButtonClickListener;
@@ -555,7 +553,7 @@
* @see #setInitialExpandedChildrenCount(int)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface OnExpandButtonClickListener {
/**
* Called when the expand button is clicked.
diff --git a/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java b/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
index 931281a..6cb7178 100644
--- a/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
+++ b/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
@@ -42,7 +42,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class PreferenceGroupAdapter extends RecyclerView.Adapter<PreferenceViewHolder>
implements Preference.OnPreferenceChangeInternalListener,
PreferenceGroup.PreferencePositionCallback {
diff --git a/preference/src/main/java/androidx/preference/PreferenceManager.java b/preference/src/main/java/androidx/preference/PreferenceManager.java
index 80382a7..7ce4b59 100644
--- a/preference/src/main/java/androidx/preference/PreferenceManager.java
+++ b/preference/src/main/java/androidx/preference/PreferenceManager.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.SharedPreferences;
@@ -98,7 +98,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public PreferenceManager(Context context) {
mContext = context;
@@ -202,7 +202,7 @@
* @return The root hierarchy (if one was not provided, the new hierarchy's root)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public PreferenceScreen inflateFromResource(Context context, int resId,
PreferenceScreen rootPreferences) {
// Block commits
diff --git a/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java b/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java
index f11c0c9..973c0ac 100644
--- a/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java
+++ b/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.view.View;
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class PreferenceRecyclerViewAccessibilityDelegate
extends RecyclerViewAccessibilityDelegate {
final RecyclerView mRecyclerView;
diff --git a/preference/src/main/java/androidx/preference/PreferenceScreen.java b/preference/src/main/java/androidx/preference/PreferenceScreen.java
index b034ed1..b8581e8 100644
--- a/preference/src/main/java/androidx/preference/PreferenceScreen.java
+++ b/preference/src/main/java/androidx/preference/PreferenceScreen.java
@@ -16,9 +16,8 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
@@ -47,8 +46,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
- @SuppressLint("RestrictedApi")
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public PreferenceScreen(Context context, AttributeSet attrs) {
super(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceScreenStyle,
android.R.attr.preferenceScreenStyle));
diff --git a/preference/src/main/java/androidx/preference/SeekBarPreference.java b/preference/src/main/java/androidx/preference/SeekBarPreference.java
index 1619d37..920fdd7 100644
--- a/preference/src/main/java/androidx/preference/SeekBarPreference.java
+++ b/preference/src/main/java/androidx/preference/SeekBarPreference.java
@@ -135,7 +135,7 @@
setMax(a.getInt(R.styleable.SeekBarPreference_android_max, 100));
setSeekBarIncrement(a.getInt(R.styleable.SeekBarPreference_seekBarIncrement, 0));
mAdjustable = a.getBoolean(R.styleable.SeekBarPreference_adjustable, true);
- mShowSeekBarValue = a.getBoolean(R.styleable.SeekBarPreference_showSeekBarValue, true);
+ mShowSeekBarValue = a.getBoolean(R.styleable.SeekBarPreference_showSeekBarValue, false);
a.recycle();
}
diff --git a/preference/src/main/java/androidx/preference/SwitchPreference.java b/preference/src/main/java/androidx/preference/SwitchPreference.java
index b084965..d668d1c 100644
--- a/preference/src/main/java/androidx/preference/SwitchPreference.java
+++ b/preference/src/main/java/androidx/preference/SwitchPreference.java
@@ -16,9 +16,8 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
@@ -61,7 +60,6 @@
* for the view, used only if defStyleAttr is 0 or can not be found in the
* theme. Can be 0 to not look for defaults.
*/
- @SuppressLint("RestrictedApi")
public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -109,7 +107,6 @@
* @param context The {@link Context} that will style this preference
* @param attrs Style attributes that differ from the default
*/
- @SuppressLint("RestrictedApi")
public SwitchPreference(Context context, AttributeSet attrs) {
this(context, attrs, TypedArrayUtils.getAttr(context,
androidx.preference.R.attr.switchPreferenceStyle,
@@ -192,7 +189,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void performClick(View view) {
super.performClick(view);
diff --git a/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java b/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java
index b2c156d..e150346 100644
--- a/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java
+++ b/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java
@@ -16,9 +16,8 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
@@ -61,7 +60,6 @@
* for the view, used only if defStyleAttr is 0 or can not be found in the
* theme. Can be 0 to not look for defaults.
*/
- @SuppressLint("RestrictedApi")
public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -189,7 +187,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void performClick(View view) {
super.performClick(view);
diff --git a/preference/src/main/java/androidx/preference/TwoStatePreference.java b/preference/src/main/java/androidx/preference/TwoStatePreference.java
index d745daa..84a43fd 100644
--- a/preference/src/main/java/androidx/preference/TwoStatePreference.java
+++ b/preference/src/main/java/androidx/preference/TwoStatePreference.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.TypedArray;
@@ -215,7 +215,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void syncSummaryView(View view) {
if (!(view instanceof TextView)) {
return;
diff --git a/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java b/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java
index 6570a4e..2a8d4fb 100644
--- a/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java
+++ b/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java
@@ -16,7 +16,7 @@
package androidx.preference;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.util.AttributeSet;
@@ -31,7 +31,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class UnPressableLinearLayout extends LinearLayout {
public UnPressableLinearLayout(Context context) {
this(context, null);
diff --git a/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java b/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java
index 9f6c1c9..3e7c445 100644
--- a/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java
+++ b/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java
@@ -16,7 +16,7 @@
package androidx.preference.internal;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -32,7 +32,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("AppCompatCustomView")
public class PreferenceImageView extends ImageView {
diff --git a/preference/src/main/java/androidx/preference/internal/package-info.java b/preference/src/main/java/androidx/preference/internal/package-info.java
index ebf333b..70347da 100644
--- a/preference/src/main/java/androidx/preference/internal/package-info.java
+++ b/preference/src/main/java/androidx/preference/internal/package-info.java
@@ -17,9 +17,9 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
package androidx.preference.internal;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
\ No newline at end of file
diff --git a/print/api/1.1.0-alpha01.txt b/print/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..a780aa9
--- /dev/null
+++ b/print/api/1.1.0-alpha01.txt
@@ -0,0 +1,30 @@
+// Signature format: 3.0
+package androidx.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(String, android.graphics.Bitmap);
+ method public void printBitmap(String, android.graphics.Bitmap, androidx.print.PrintHelper.OnPrintFinishCallback?);
+ method public void printBitmap(String, android.net.Uri) throws java.io.FileNotFoundException;
+ method public void printBitmap(String, android.net.Uri, androidx.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 interface PrintHelper.OnPrintFinishCallback {
+ method public void onFinish();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/print/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to print/api/res-1.1.0-alpha01.txt
diff --git a/recommendation/api/1.1.0-alpha01.txt b/recommendation/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..f5c1149
--- /dev/null
+++ b/recommendation/api/1.1.0-alpha01.txt
@@ -0,0 +1,133 @@
+// Signature format: 3.0
+package androidx.recommendation.app {
+
+ public final class ContentRecommendation {
+ method public String! getBackgroundImageUri();
+ method public int getBadgeImageResourceId();
+ method public int getColor();
+ method public android.graphics.Bitmap! getContentImage();
+ method public androidx.recommendation.app.ContentRecommendation.IntentData! getContentIntent();
+ method public String[]! getContentTypes();
+ method public androidx.recommendation.app.ContentRecommendation.IntentData! getDismissIntent();
+ method public String[]! getGenres();
+ method public String! getGroup();
+ method public String! getIdTag();
+ method public String! getMaturityRating();
+ method public android.app.Notification! getNotificationObject(android.content.Context!);
+ method public String! getPricingType();
+ method public String! getPricingValue();
+ method public String! getPrimaryContentType();
+ method public int getProgressMax();
+ method public int getProgressValue();
+ method public long getRunningTime();
+ method public String! getSortKey();
+ method public String! getSourceName();
+ method public int getStatus();
+ method public String! getText();
+ method public String! getTitle();
+ method public boolean hasProgressInfo();
+ method public boolean isAutoDismiss();
+ method public void setAutoDismiss(boolean);
+ method public void setGroup(String!);
+ method public void setProgress(int, int);
+ method public void setSortKey(String!);
+ method public void setStatus(@androidx.recommendation.app.ContentRecommendation.ContentStatus int);
+ field public static final String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
+ field public static final String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
+ field public static final String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
+ field public static final String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
+ field public static final String CONTENT_PRICING_FREE = "android.contentPrice.free";
+ field public static final String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
+ field public static final String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
+ field public static final String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
+ field public static final String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
+ field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
+ field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
+ field public static final int CONTENT_STATUS_READY = 0; // 0x0
+ field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
+ field public static final String CONTENT_TYPE_APP = "android.contentType.app";
+ field public static final String CONTENT_TYPE_BOOK = "android.contentType.book";
+ field public static final String CONTENT_TYPE_COMIC = "android.contentType.comic";
+ field public static final String CONTENT_TYPE_GAME = "android.contentType.game";
+ field public static final String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
+ field public static final String CONTENT_TYPE_MOVIE = "android.contentType.movie";
+ field public static final String CONTENT_TYPE_MUSIC = "android.contentType.music";
+ field public static final String CONTENT_TYPE_NEWS = "android.contentType.news";
+ field public static final String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
+ field public static final String CONTENT_TYPE_RADIO = "android.contentType.radio";
+ field public static final String CONTENT_TYPE_SERIAL = "android.contentType.serial";
+ field public static final String CONTENT_TYPE_SPORTS = "android.contentType.sports";
+ field public static final String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
+ field public static final String CONTENT_TYPE_VIDEO = "android.contentType.video";
+ field public static final String CONTENT_TYPE_WEBSITE = "android.contentType.website";
+ field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
+ field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
+ field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
+ }
+
+ public static final class ContentRecommendation.Builder {
+ ctor public ContentRecommendation.Builder();
+ method public androidx.recommendation.app.ContentRecommendation! build();
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setAutoDismiss(boolean);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setBackgroundImageUri(String?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setBadgeIcon(@DrawableRes int);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setColor(@ColorInt int);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setContentImage(android.graphics.Bitmap!);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setContentIntentData(@androidx.recommendation.app.ContentRecommendation.IntentType int, android.content.Intent!, int, android.os.Bundle?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setContentTypes(String[]!);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setDismissIntentData(@androidx.recommendation.app.ContentRecommendation.IntentType int, android.content.Intent?, int, android.os.Bundle?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setGenres(String[]!);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setGroup(String?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setIdTag(String!);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setMaturityRating(@androidx.recommendation.app.ContentRecommendation.ContentMaturity String!);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setPricingInformation(@androidx.recommendation.app.ContentRecommendation.ContentPricing String!, String?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setProgress(int, int);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setRunningTime(long);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setSortKey(String?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setSourceName(String?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setStatus(@androidx.recommendation.app.ContentRecommendation.ContentStatus int);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setText(String?);
+ method public androidx.recommendation.app.ContentRecommendation.Builder! setTitle(String!);
+ }
+
+ @StringDef({androidx.recommendation.app.ContentRecommendation.CONTENT_MATURITY_ALL, androidx.recommendation.app.ContentRecommendation.CONTENT_MATURITY_LOW, androidx.recommendation.app.ContentRecommendation.CONTENT_MATURITY_MEDIUM, androidx.recommendation.app.ContentRecommendation.CONTENT_MATURITY_HIGH}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentRecommendation.ContentMaturity {
+ }
+
+ @StringDef({androidx.recommendation.app.ContentRecommendation.CONTENT_PRICING_FREE, androidx.recommendation.app.ContentRecommendation.CONTENT_PRICING_RENTAL, androidx.recommendation.app.ContentRecommendation.CONTENT_PRICING_PURCHASE, androidx.recommendation.app.ContentRecommendation.CONTENT_PRICING_PREORDER, androidx.recommendation.app.ContentRecommendation.CONTENT_PRICING_SUBSCRIPTION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentRecommendation.ContentPricing {
+ }
+
+ @IntDef({androidx.recommendation.app.ContentRecommendation.CONTENT_STATUS_READY, androidx.recommendation.app.ContentRecommendation.CONTENT_STATUS_PENDING, androidx.recommendation.app.ContentRecommendation.CONTENT_STATUS_AVAILABLE, androidx.recommendation.app.ContentRecommendation.CONTENT_STATUS_UNAVAILABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentRecommendation.ContentStatus {
+ }
+
+ @StringDef({androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_VIDEO, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_MOVIE, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_TRAILER, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_SERIAL, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_MUSIC, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_RADIO, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_PODCAST, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_NEWS, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_SPORTS, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_APP, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_GAME, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_BOOK, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_COMIC, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_MAGAZINE, androidx.recommendation.app.ContentRecommendation.CONTENT_TYPE_WEBSITE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentRecommendation.ContentType {
+ }
+
+ public static class ContentRecommendation.IntentData {
+ ctor public ContentRecommendation.IntentData();
+ }
+
+ @IntDef({androidx.recommendation.app.ContentRecommendation.INTENT_TYPE_ACTIVITY, androidx.recommendation.app.ContentRecommendation.INTENT_TYPE_BROADCAST, androidx.recommendation.app.ContentRecommendation.INTENT_TYPE_SERVICE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentRecommendation.IntentType {
+ }
+
+ public final class RecommendationExtender implements android.app.Notification.Extender {
+ ctor public RecommendationExtender();
+ ctor public RecommendationExtender(android.app.Notification!);
+ method public android.app.Notification.Builder! extend(android.app.Notification.Builder!);
+ method public String[]! getContentTypes();
+ method public String[]! getGenres();
+ method public String! getMaturityRating();
+ method public String! getPricingType();
+ method public String! getPricingValue();
+ method public String! getPrimaryContentType();
+ method public long getRunningTime();
+ method public int getStatus();
+ method public androidx.recommendation.app.RecommendationExtender! setContentTypes(String[]!);
+ method public androidx.recommendation.app.RecommendationExtender! setGenres(String[]!);
+ method public androidx.recommendation.app.RecommendationExtender! setMaturityRating(@androidx.recommendation.app.ContentRecommendation.ContentMaturity String!);
+ method public androidx.recommendation.app.RecommendationExtender! setPricingInformation(@androidx.recommendation.app.ContentRecommendation.ContentPricing String!, String!);
+ method public androidx.recommendation.app.RecommendationExtender! setRunningTime(long);
+ method public androidx.recommendation.app.RecommendationExtender! setStatus(@androidx.recommendation.app.ContentRecommendation.ContentStatus int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/recommendation/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to recommendation/api/res-1.1.0-alpha01.txt
diff --git a/recyclerview/recyclerview/api/1.1.0-alpha03.txt b/recyclerview/recyclerview/api/1.1.0-alpha03.txt
new file mode 100644
index 0000000..5d61aaf
--- /dev/null
+++ b/recyclerview/recyclerview/api/1.1.0-alpha03.txt
@@ -0,0 +1,1033 @@
+// Signature format: 3.0
+package androidx.recyclerview.widget {
+
+ public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+ ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
+ method public void onChanged(int, int, Object!);
+ method public void onInserted(int, int);
+ method public void onMoved(int, int);
+ method public void onRemoved(int, int);
+ }
+
+ public final class AsyncDifferConfig<T> {
+ method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+ method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T> getDiffCallback();
+ }
+
+ public static final class AsyncDifferConfig.Builder<T> {
+ ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T>);
+ method public androidx.recyclerview.widget.AsyncDifferConfig<T> build();
+ method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T> setBackgroundThreadExecutor(java.util.concurrent.Executor!);
+ }
+
+ public class AsyncListDiffer<T> {
+ ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T>);
+ ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T>);
+ method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T>);
+ method public java.util.List<T> getCurrentList();
+ method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T>);
+ method public void submitList(java.util.List<T>?);
+ method public void submitList(java.util.List<T>?, Runnable?);
+ }
+
+ public static interface AsyncListDiffer.ListListener<T> {
+ method public void onCurrentListChanged(java.util.List<T>, java.util.List<T>);
+ }
+
+ public class AsyncListUtil<T> {
+ ctor public AsyncListUtil(Class<T>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
+ method public T? getItem(int);
+ method public int getItemCount();
+ method public void onRangeChanged();
+ method public void refresh();
+ }
+
+ public abstract static class AsyncListUtil.DataCallback<T> {
+ ctor public AsyncListUtil.DataCallback();
+ method @WorkerThread public abstract void fillData(T[], int, int);
+ method @WorkerThread public int getMaxCachedTiles();
+ method @WorkerThread public void recycleData(T[], int);
+ method @WorkerThread public abstract int refreshData();
+ }
+
+ public abstract static class AsyncListUtil.ViewCallback {
+ ctor public AsyncListUtil.ViewCallback();
+ method @UiThread public void extendRangeInto(int[], int[], int);
+ method @UiThread public abstract void getItemRangeInto(int[]);
+ method @UiThread public abstract void onDataRefresh();
+ method @UiThread public abstract void onItemLoaded(int);
+ field public static final int HINT_SCROLL_ASC = 2; // 0x2
+ field public static final int HINT_SCROLL_DESC = 1; // 0x1
+ field public static final int HINT_SCROLL_NONE = 0; // 0x0
+ }
+
+ public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+ ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
+ method public void dispatchLastEvent();
+ method public void onChanged(int, int, Object!);
+ method public void onInserted(int, int);
+ method public void onMoved(int, int);
+ method public void onRemoved(int, int);
+ }
+
+ public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
+ ctor public DefaultItemAnimator();
+ method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+ method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+ method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void endAnimations();
+ method public boolean isRunning();
+ method public void runPendingAnimations();
+ }
+
+ public class DiffUtil {
+ method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
+ method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
+ }
+
+ public abstract static class DiffUtil.Callback {
+ ctor public DiffUtil.Callback();
+ method public abstract boolean areContentsTheSame(int, int);
+ method public abstract boolean areItemsTheSame(int, int);
+ method public Object? getChangePayload(int, int);
+ method public abstract int getNewListSize();
+ method public abstract int getOldListSize();
+ }
+
+ public static class DiffUtil.DiffResult {
+ method public int convertNewPositionToOld(@IntRange(from=0) int);
+ method public int convertOldPositionToNew(@IntRange(from=0) int);
+ method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
+ method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
+ field public static final int NO_POSITION = -1; // 0xffffffff
+ }
+
+ public abstract static class DiffUtil.ItemCallback<T> {
+ ctor public DiffUtil.ItemCallback();
+ method public abstract boolean areContentsTheSame(T, T);
+ method public abstract boolean areItemsTheSame(T, T);
+ method public Object? getChangePayload(T, T);
+ }
+
+ public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
+ ctor public DividerItemDecoration(android.content.Context!, int);
+ method public void setDrawable(android.graphics.drawable.Drawable);
+ method public void setOrientation(int);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+ ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public GridLayoutManager(android.content.Context!, int);
+ ctor public GridLayoutManager(android.content.Context!, int, int, boolean);
+ method public int getSpanCount();
+ method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
+ method public boolean isUsingSpansToEstimateScrollbarDimensions();
+ method public void setSpanCount(int);
+ method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
+ method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
+ field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+ }
+
+ public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
+ ctor public GridLayoutManager.DefaultSpanSizeLookup();
+ method public int getSpanSize(int);
+ }
+
+ public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+ ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public GridLayoutManager.LayoutParams(int, int);
+ ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+ method public int getSpanIndex();
+ method public int getSpanSize();
+ field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+ }
+
+ public abstract static class GridLayoutManager.SpanSizeLookup {
+ ctor public GridLayoutManager.SpanSizeLookup();
+ method public int getSpanGroupIndex(int, int);
+ method public int getSpanIndex(int, int);
+ method public abstract int getSpanSize(int);
+ method public void invalidateSpanGroupIndexCache();
+ method public void invalidateSpanIndexCache();
+ method public boolean isSpanGroupIndexCacheEnabled();
+ method public boolean isSpanIndexCacheEnabled();
+ method public void setSpanGroupIndexCacheEnabled(boolean);
+ method public void setSpanIndexCacheEnabled(boolean);
+ }
+
+ public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
+ ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
+ method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
+ method public void onChildViewAttachedToWindow(android.view.View);
+ method public void onChildViewDetachedFromWindow(android.view.View);
+ method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ field public static final int ACTION_STATE_DRAG = 2; // 0x2
+ field public static final int ACTION_STATE_IDLE = 0; // 0x0
+ field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+ field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+ field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+ field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+ field public static final int DOWN = 2; // 0x2
+ field public static final int END = 32; // 0x20
+ field public static final int LEFT = 4; // 0x4
+ field public static final int RIGHT = 8; // 0x8
+ field public static final int START = 16; // 0x10
+ field public static final int UP = 1; // 0x1
+ }
+
+ public abstract static class ItemTouchHelper.Callback {
+ ctor public ItemTouchHelper.Callback();
+ method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder>, int, int);
+ method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public int convertToAbsoluteDirection(int, int);
+ method public static int convertToRelativeDirection(int, int);
+ method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
+ method public int getBoundingBoxMargin();
+ method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
+ method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public float getSwipeEscapeVelocity(float);
+ method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public float getSwipeVelocityThreshold(float);
+ method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
+ method public boolean isItemViewSwipeEnabled();
+ method public boolean isLongPressDragEnabled();
+ method public static int makeFlag(int, int);
+ method public static int makeMovementFlags(int, int);
+ method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+ method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
+ method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
+ method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
+ method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+ field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+ field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+ }
+
+ public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
+ ctor public ItemTouchHelper.SimpleCallback(int, int);
+ method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public void setDefaultDragDirs(int);
+ method public void setDefaultSwipeDirs(int);
+ }
+
+ public static interface ItemTouchHelper.ViewDropHandler {
+ method public void prepareForDrop(android.view.View, android.view.View, int, int);
+ }
+
+ public interface ItemTouchUIUtil {
+ method public void clearView(android.view.View!);
+ method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+ method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+ method public void onSelected(android.view.View!);
+ }
+
+ public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+ ctor public LinearLayoutManager(android.content.Context!);
+ ctor public LinearLayoutManager(android.content.Context!, int, boolean);
+ ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public android.graphics.PointF! computeScrollVectorForPosition(int);
+ method public int findFirstCompletelyVisibleItemPosition();
+ method public int findFirstVisibleItemPosition();
+ method public int findLastCompletelyVisibleItemPosition();
+ method public int findLastVisibleItemPosition();
+ method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+ method protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+ method public int getInitialPrefetchItemCount();
+ method public int getOrientation();
+ method public boolean getRecycleChildrenOnDetach();
+ method public boolean getReverseLayout();
+ method public boolean getStackFromEnd();
+ method protected boolean isLayoutRTL();
+ method public boolean isSmoothScrollbarEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void prepareForDrop(android.view.View, android.view.View, int, int);
+ method public void scrollToPositionWithOffset(int, int);
+ method public void setInitialPrefetchItemCount(int);
+ method public void setOrientation(int);
+ method public void setRecycleChildrenOnDetach(boolean);
+ method public void setReverseLayout(boolean);
+ method public void setSmoothScrollbarEnabled(boolean);
+ method public void setStackFromEnd(boolean);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ protected static class LinearLayoutManager.LayoutChunkResult {
+ ctor protected LinearLayoutManager.LayoutChunkResult();
+ field public int mConsumed;
+ field public boolean mFinished;
+ field public boolean mFocusable;
+ field public boolean mIgnoreConsumed;
+ }
+
+ public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
+ ctor public LinearSmoothScroller(android.content.Context!);
+ method public int calculateDtToFit(int, int, int, int, int);
+ method public int calculateDxToMakeVisible(android.view.View!, int);
+ method public int calculateDyToMakeVisible(android.view.View!, int);
+ method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
+ method protected int calculateTimeForDeceleration(int);
+ method protected int calculateTimeForScrolling(int);
+ method protected int getHorizontalSnapPreference();
+ method protected int getVerticalSnapPreference();
+ method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+ method protected void onStart();
+ method protected void onStop();
+ method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+ method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+ field public static final int SNAP_TO_ANY = 0; // 0x0
+ field public static final int SNAP_TO_END = 1; // 0x1
+ field public static final int SNAP_TO_START = -1; // 0xffffffff
+ field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
+ field protected int mInterimTargetDx;
+ field protected int mInterimTargetDy;
+ field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
+ field protected android.graphics.PointF! mTargetVector;
+ }
+
+ public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+ ctor public LinearSnapHelper();
+ method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+ method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+ }
+
+ public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T>);
+ ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T>);
+ method public java.util.List<T> getCurrentList();
+ method protected T! getItem(int);
+ method public int getItemCount();
+ method public void onCurrentListChanged(java.util.List<T>, java.util.List<T>);
+ method public void submitList(java.util.List<T>?);
+ method public void submitList(java.util.List<T>?, Runnable?);
+ }
+
+ public interface ListUpdateCallback {
+ method public void onChanged(int, int, Object?);
+ method public void onInserted(int, int);
+ method public void onMoved(int, int);
+ method public void onRemoved(int, int);
+ }
+
+ public abstract class OrientationHelper {
+ method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int);
+ method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public abstract int getDecoratedEnd(android.view.View!);
+ method public abstract int getDecoratedMeasurement(android.view.View!);
+ method public abstract int getDecoratedMeasurementInOther(android.view.View!);
+ method public abstract int getDecoratedStart(android.view.View!);
+ method public abstract int getEnd();
+ method public abstract int getEndAfterPadding();
+ method public abstract int getEndPadding();
+ method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
+ method public abstract int getMode();
+ method public abstract int getModeInOther();
+ method public abstract int getStartAfterPadding();
+ method public abstract int getTotalSpace();
+ method public int getTotalSpaceChange();
+ method public abstract int getTransformedEndWithDecoration(android.view.View!);
+ method public abstract int getTransformedStartWithDecoration(android.view.View!);
+ method public abstract void offsetChild(android.view.View!, int);
+ method public abstract void offsetChildren(int);
+ method public void onLayoutComplete();
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
+ }
+
+ public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+ ctor public PagerSnapHelper();
+ method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+ method protected androidx.recyclerview.widget.LinearSmoothScroller! createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+ }
+
+ public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
+ ctor public RecyclerView(android.content.Context);
+ ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
+ ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
+ method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
+ method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+ method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+ method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+ method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+ method public void clearOnChildAttachStateChangeListeners();
+ method public void clearOnScrollListeners();
+ method public int computeHorizontalScrollExtent();
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+ method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]!);
+ method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
+ method public android.view.View? findChildViewUnder(float, float);
+ method public android.view.View? findContainingItemView(android.view.View);
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
+ method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
+ method public boolean fling(int, int);
+ method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+ method public int getChildAdapterPosition(android.view.View);
+ method public long getChildItemId(android.view.View);
+ method public int getChildLayoutPosition(android.view.View);
+ method @Deprecated public int getChildPosition(android.view.View);
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
+ method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
+ method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+ method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+ method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
+ method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+ method public int getItemDecorationCount();
+ method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+ method public int getMaxFlingVelocity();
+ method public int getMinFlingVelocity();
+ method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
+ method public boolean getPreserveFocusAfterLayout();
+ method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+ method public int getScrollState();
+ method public boolean hasFixedSize();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean hasPendingAdapterUpdates();
+ method public void invalidateItemDecorations();
+ method public boolean isAnimating();
+ method public boolean isComputingLayout();
+ method @Deprecated public boolean isLayoutFrozen();
+ method public final boolean isLayoutSuppressed();
+ method public void offsetChildrenHorizontal(@Px int);
+ method public void offsetChildrenVertical(@Px int);
+ method public void onChildAttachedToWindow(android.view.View);
+ method public void onChildDetachedFromWindow(android.view.View);
+ method public void onDraw(android.graphics.Canvas!);
+ method public void onScrollStateChanged(int);
+ method public void onScrolled(@Px int, @Px int);
+ method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+ method public void removeItemDecorationAt(int);
+ method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+ method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+ method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+ method public void scrollToPosition(int);
+ method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
+ method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
+ method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
+ method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
+ method public void setHasFixedSize(boolean);
+ method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
+ method public void setItemViewCacheSize(int);
+ method @Deprecated public void setLayoutFrozen(boolean);
+ method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
+ method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
+ method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
+ method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
+ method public void setPreserveFocusAfterLayout(boolean);
+ method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
+ method public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
+ method public void setScrollingTouchSlop(int);
+ method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
+ method public void smoothScrollBy(@Px int, @Px int);
+ method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
+ method public void smoothScrollToPosition(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ method public void stopScroll();
+ method public final void suppressLayout(boolean);
+ method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int INVALID_TYPE = -1; // 0xffffffff
+ field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+ field public static final int NO_POSITION = -1; // 0xffffffff
+ field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+ field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+ field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+ field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+ field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+ ctor public RecyclerView.Adapter();
+ method public final void bindViewHolder(VH, int);
+ method public final VH createViewHolder(android.view.ViewGroup, int);
+ method public abstract int getItemCount();
+ method public long getItemId(int);
+ method public int getItemViewType(int);
+ method public final boolean hasObservers();
+ method public final boolean hasStableIds();
+ method public final void notifyDataSetChanged();
+ method public final void notifyItemChanged(int);
+ method public final void notifyItemChanged(int, Object?);
+ method public final void notifyItemInserted(int);
+ method public final void notifyItemMoved(int, int);
+ method public final void notifyItemRangeChanged(int, int);
+ method public final void notifyItemRangeChanged(int, int, Object?);
+ method public final void notifyItemRangeInserted(int, int);
+ method public final void notifyItemRangeRemoved(int, int);
+ method public final void notifyItemRemoved(int);
+ method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+ method public abstract void onBindViewHolder(VH, int);
+ method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
+ method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+ method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+ method public boolean onFailedToRecycleView(VH);
+ method public void onViewAttachedToWindow(VH);
+ method public void onViewDetachedFromWindow(VH);
+ method public void onViewRecycled(VH);
+ method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+ method public void setHasStableIds(boolean);
+ method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+ }
+
+ public abstract static class RecyclerView.AdapterDataObserver {
+ ctor public RecyclerView.AdapterDataObserver();
+ method public void onChanged();
+ method public void onItemRangeChanged(int, int);
+ method public void onItemRangeChanged(int, int, Object?);
+ method public void onItemRangeInserted(int, int);
+ method public void onItemRangeMoved(int, int, int);
+ method public void onItemRangeRemoved(int, int);
+ }
+
+ public static interface RecyclerView.ChildDrawingOrderCallback {
+ method public int onGetChildDrawingOrder(int, int);
+ }
+
+ public static class RecyclerView.EdgeEffectFactory {
+ ctor public RecyclerView.EdgeEffectFactory();
+ method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
+ field public static final int DIRECTION_BOTTOM = 3; // 0x3
+ field public static final int DIRECTION_LEFT = 0; // 0x0
+ field public static final int DIRECTION_RIGHT = 2; // 0x2
+ field public static final int DIRECTION_TOP = 1; // 0x1
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
+ }
+
+ public abstract static class RecyclerView.ItemAnimator {
+ ctor public RecyclerView.ItemAnimator();
+ method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+ method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+ method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+ method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+ method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object>);
+ method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public final void dispatchAnimationsFinished();
+ method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public abstract void endAnimations();
+ method public long getAddDuration();
+ method public long getChangeDuration();
+ method public long getMoveDuration();
+ method public long getRemoveDuration();
+ method public abstract boolean isRunning();
+ method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
+ method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+ method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object>);
+ method public abstract void runPendingAnimations();
+ method public void setAddDuration(long);
+ method public void setChangeDuration(long);
+ method public void setMoveDuration(long);
+ method public void setRemoveDuration(long);
+ field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+ field public static final int FLAG_CHANGED = 2; // 0x2
+ field public static final int FLAG_INVALIDATED = 4; // 0x4
+ field public static final int FLAG_MOVED = 2048; // 0x800
+ field public static final int FLAG_REMOVED = 8; // 0x8
+ }
+
+ @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
+ }
+
+ public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+ method public void onAnimationsFinished();
+ }
+
+ public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+ ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+ method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
+ field public int bottom;
+ field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
+ field public int left;
+ field public int right;
+ field public int top;
+ }
+
+ public abstract static class RecyclerView.ItemDecoration {
+ ctor public RecyclerView.ItemDecoration();
+ method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
+ method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+ method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+ method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+ method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+ method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+ }
+
+ public abstract static class RecyclerView.LayoutManager {
+ ctor public RecyclerView.LayoutManager();
+ method public void addDisappearingView(android.view.View!);
+ method public void addDisappearingView(android.view.View!, int);
+ method public void addView(android.view.View!);
+ method public void addView(android.view.View!, int);
+ method public void assertInLayoutOrScroll(String!);
+ method public void assertNotInLayoutOrScroll(String!);
+ method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+ method public void attachView(android.view.View, int);
+ method public void attachView(android.view.View);
+ method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+ method public boolean canScrollHorizontally();
+ method public boolean canScrollVertically();
+ method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+ method public static int chooseSize(int, int, int);
+ method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+ method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+ method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+ method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+ method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+ method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+ method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+ method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+ method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+ method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+ method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+ method public void detachView(android.view.View);
+ method public void detachViewAt(int);
+ method public void endAnimation(android.view.View!);
+ method public android.view.View? findContainingItemView(android.view.View);
+ method public android.view.View? findViewByPosition(int);
+ method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
+ method public int getBaseline();
+ method public int getBottomDecorationHeight(android.view.View);
+ method public android.view.View? getChildAt(int);
+ method public int getChildCount();
+ method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
+ method public static int getChildMeasureSpec(int, int, int, int, boolean);
+ method public boolean getClipToPadding();
+ method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+ method public int getDecoratedBottom(android.view.View);
+ method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+ method public int getDecoratedLeft(android.view.View);
+ method public int getDecoratedMeasuredHeight(android.view.View);
+ method public int getDecoratedMeasuredWidth(android.view.View);
+ method public int getDecoratedRight(android.view.View);
+ method public int getDecoratedTop(android.view.View);
+ method public android.view.View? getFocusedChild();
+ method @Px public int getHeight();
+ method public int getHeightMode();
+ method public int getItemCount();
+ method public int getItemViewType(android.view.View);
+ method public int getLayoutDirection();
+ method public int getLeftDecorationWidth(android.view.View);
+ method @Px public int getMinimumHeight();
+ method @Px public int getMinimumWidth();
+ method @Px public int getPaddingBottom();
+ method @Px public int getPaddingEnd();
+ method @Px public int getPaddingLeft();
+ method @Px public int getPaddingRight();
+ method @Px public int getPaddingStart();
+ method @Px public int getPaddingTop();
+ method public int getPosition(android.view.View);
+ method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
+ method public int getRightDecorationWidth(android.view.View);
+ method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+ method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+ method public int getTopDecorationHeight(android.view.View);
+ method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+ method @Px public int getWidth();
+ method public int getWidthMode();
+ method public boolean hasFocus();
+ method public void ignoreView(android.view.View);
+ method public boolean isAttachedToWindow();
+ method public boolean isAutoMeasureEnabled();
+ method public boolean isFocused();
+ method public final boolean isItemPrefetchEnabled();
+ method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+ method public boolean isMeasurementCacheEnabled();
+ method public boolean isSmoothScrolling();
+ method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+ method public void layoutDecorated(android.view.View, int, int, int, int);
+ method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+ method public void measureChild(android.view.View, int, int);
+ method public void measureChildWithMargins(android.view.View, int, int);
+ method public void moveView(int, int);
+ method public void offsetChildrenHorizontal(@Px int);
+ method public void offsetChildrenVertical(@Px int);
+ method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
+ method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
+ method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
+ method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
+ method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
+ method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+ method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+ method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+ method public android.view.View? onInterceptFocusSearch(android.view.View, int);
+ method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
+ method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
+ method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
+ method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
+ method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
+ method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
+ method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+ method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
+ method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
+ method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
+ method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable? onSaveInstanceState();
+ method public void onScrollStateChanged(int);
+ method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
+ method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
+ method public void postOnAnimation(Runnable!);
+ method public void removeAllViews();
+ method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+ method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+ method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+ method public boolean removeCallbacks(Runnable!);
+ method public void removeDetachedView(android.view.View);
+ method public void removeView(android.view.View!);
+ method public void removeViewAt(int);
+ method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+ method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+ method public void requestLayout();
+ method public void requestSimpleAnimationsInNextLayout();
+ method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+ method public void scrollToPosition(int);
+ method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+ method @Deprecated public void setAutoMeasureEnabled(boolean);
+ method public final void setItemPrefetchEnabled(boolean);
+ method public void setMeasuredDimension(android.graphics.Rect!, int, int);
+ method public void setMeasuredDimension(int, int);
+ method public void setMeasurementCacheEnabled(boolean);
+ method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
+ method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
+ method public void stopIgnoringView(android.view.View);
+ method public boolean supportsPredictiveItemAnimations();
+ }
+
+ public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+ method public void addPosition(int, int);
+ }
+
+ public static class RecyclerView.LayoutManager.Properties {
+ ctor public RecyclerView.LayoutManager.Properties();
+ field public int orientation;
+ field public boolean reverseLayout;
+ field public int spanCount;
+ field public boolean stackFromEnd;
+ }
+
+ public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public RecyclerView.LayoutParams(int, int);
+ ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+ method public int getViewAdapterPosition();
+ method public int getViewLayoutPosition();
+ method @Deprecated public int getViewPosition();
+ method public boolean isItemChanged();
+ method public boolean isItemRemoved();
+ method public boolean isViewInvalid();
+ method public boolean viewNeedsUpdate();
+ }
+
+ public static interface RecyclerView.OnChildAttachStateChangeListener {
+ method public void onChildViewAttachedToWindow(android.view.View);
+ method public void onChildViewDetachedFromWindow(android.view.View);
+ }
+
+ public abstract static class RecyclerView.OnFlingListener {
+ ctor public RecyclerView.OnFlingListener();
+ method public abstract boolean onFling(int, int);
+ }
+
+ public static interface RecyclerView.OnItemTouchListener {
+ method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+ method public void onRequestDisallowInterceptTouchEvent(boolean);
+ method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+ }
+
+ public abstract static class RecyclerView.OnScrollListener {
+ ctor public RecyclerView.OnScrollListener();
+ method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
+ method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
+ }
+
+ public static class RecyclerView.RecycledViewPool {
+ ctor public RecyclerView.RecycledViewPool();
+ method public void clear();
+ method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
+ method public int getRecycledViewCount(int);
+ method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void setMaxRecycledViews(int, int);
+ }
+
+ public final class RecyclerView.Recycler {
+ ctor public RecyclerView.Recycler();
+ method public void bindViewToPosition(android.view.View, int);
+ method public void clear();
+ method public int convertPreLayoutPositionToPostLayout(int);
+ method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder> getScrapList();
+ method public android.view.View getViewForPosition(int);
+ method public void recycleView(android.view.View);
+ method public void setViewCacheSize(int);
+ }
+
+ public static interface RecyclerView.RecyclerListener {
+ method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+ }
+
+ public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
+ ctor public RecyclerView.SimpleOnItemTouchListener();
+ method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+ method public void onRequestDisallowInterceptTouchEvent(boolean);
+ method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+ }
+
+ public abstract static class RecyclerView.SmoothScroller {
+ ctor public RecyclerView.SmoothScroller();
+ method public android.graphics.PointF? computeScrollVectorForPosition(int);
+ method public android.view.View! findViewByPosition(int);
+ method public int getChildCount();
+ method public int getChildPosition(android.view.View!);
+ method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+ method public int getTargetPosition();
+ method @Deprecated public void instantScrollToPosition(int);
+ method public boolean isPendingInitialRun();
+ method public boolean isRunning();
+ method protected void normalize(android.graphics.PointF);
+ method protected void onChildAttachedToWindow(android.view.View!);
+ method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+ method protected abstract void onStart();
+ method protected abstract void onStop();
+ method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+ method public void setTargetPosition(int);
+ method protected final void stop();
+ }
+
+ public static class RecyclerView.SmoothScroller.Action {
+ ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
+ ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
+ ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
+ method public int getDuration();
+ method @Px public int getDx();
+ method @Px public int getDy();
+ method public android.view.animation.Interpolator? getInterpolator();
+ method public void jumpTo(int);
+ method public void setDuration(int);
+ method public void setDx(@Px int);
+ method public void setDy(@Px int);
+ method public void setInterpolator(android.view.animation.Interpolator?);
+ method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
+ field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+ }
+
+ public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+ method public android.graphics.PointF? computeScrollVectorForPosition(int);
+ }
+
+ public static class RecyclerView.State {
+ ctor public RecyclerView.State();
+ method public boolean didStructureChange();
+ method public <T> T! get(int);
+ method public int getItemCount();
+ method public int getRemainingScrollHorizontal();
+ method public int getRemainingScrollVertical();
+ method public int getTargetScrollPosition();
+ method public boolean hasTargetScrollPosition();
+ method public boolean isMeasuring();
+ method public boolean isPreLayout();
+ method public void put(int, Object!);
+ method public void remove(int);
+ method public boolean willRunPredictiveAnimations();
+ method public boolean willRunSimpleAnimations();
+ }
+
+ public abstract static class RecyclerView.ViewCacheExtension {
+ ctor public RecyclerView.ViewCacheExtension();
+ method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
+ }
+
+ public abstract static class RecyclerView.ViewHolder {
+ ctor public RecyclerView.ViewHolder(android.view.View);
+ method public final int getAdapterPosition();
+ method public final long getItemId();
+ method public final int getItemViewType();
+ method public final int getLayoutPosition();
+ method public final int getOldPosition();
+ method @Deprecated public final int getPosition();
+ method public final boolean isRecyclable();
+ method public final void setIsRecyclable(boolean);
+ field public final android.view.View itemView;
+ }
+
+ public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+ ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
+ method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
+ }
+
+ public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+ ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
+ }
+
+ public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
+ ctor public SimpleItemAnimator();
+ method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+ method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+ method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+ method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+ method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+ method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+ method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+ method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+ method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public boolean getSupportsChangeAnimations();
+ method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+ method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+ method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+ method public void setSupportsChangeAnimations(boolean);
+ }
+
+ public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
+ ctor public SnapHelper();
+ method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
+ method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+ method public int[]! calculateScrollDistance(int, int);
+ method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+ method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+ method public boolean onFling(int, int);
+ }
+
+ public class SortedList<T> {
+ ctor public SortedList(Class<T>, androidx.recyclerview.widget.SortedList.Callback<T>);
+ ctor public SortedList(Class<T>, androidx.recyclerview.widget.SortedList.Callback<T>, int);
+ method public int add(T!);
+ method public void addAll(T[], boolean);
+ method public void addAll(T...);
+ method public void addAll(java.util.Collection<T>);
+ method public void beginBatchedUpdates();
+ method public void clear();
+ method public void endBatchedUpdates();
+ method public T! get(int) throws java.lang.IndexOutOfBoundsException;
+ method public int indexOf(T!);
+ method public void recalculatePositionOfItemAt(int);
+ method public boolean remove(T!);
+ method public T! removeItemAt(int);
+ method public void replaceAll(T[], boolean);
+ method public void replaceAll(T...);
+ method public void replaceAll(java.util.Collection<T>);
+ method public int size();
+ method public void updateItemAt(int, T!);
+ field public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+ ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2>!);
+ method public boolean areContentsTheSame(T2!, T2!);
+ method public boolean areItemsTheSame(T2!, T2!);
+ method public int compare(T2!, T2!);
+ method public void dispatchLastEvent();
+ method public void onChanged(int, int);
+ method public void onInserted(int, int);
+ method public void onMoved(int, int);
+ method public void onRemoved(int, int);
+ }
+
+ public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
+ ctor public SortedList.Callback();
+ method public abstract boolean areContentsTheSame(T2!, T2!);
+ method public abstract boolean areItemsTheSame(T2!, T2!);
+ method public abstract int compare(T2!, T2!);
+ method public Object? getChangePayload(T2!, T2!);
+ method public abstract void onChanged(int, int);
+ method public void onChanged(int, int, Object!);
+ }
+
+ public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+ ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter!);
+ method public void onChanged(int, int);
+ method public void onInserted(int, int);
+ method public void onMoved(int, int);
+ method public void onRemoved(int, int);
+ }
+
+ public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+ ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+ ctor public StaggeredGridLayoutManager(int, int);
+ method public android.graphics.PointF! computeScrollVectorForPosition(int);
+ method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
+ method public int[]! findFirstVisibleItemPositions(int[]!);
+ method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
+ method public int[]! findLastVisibleItemPositions(int[]!);
+ method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+ method public int getGapStrategy();
+ method public int getOrientation();
+ method public boolean getReverseLayout();
+ method public int getSpanCount();
+ method public void invalidateSpanAssignments();
+ method public void scrollToPositionWithOffset(int, int);
+ method public void setGapStrategy(int);
+ method public void setOrientation(int);
+ method public void setReverseLayout(boolean);
+ method public void setSpanCount(int);
+ field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
+ field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+ field public static final int GAP_HANDLING_NONE = 0; // 0x0
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+ ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+ ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+ method public final int getSpanIndex();
+ method public boolean isFullSpan();
+ method public void setFullSpan(boolean);
+ field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+ }
+
+}
+
diff --git a/recyclerview/recyclerview/api/current.txt b/recyclerview/recyclerview/api/current.txt
index 77ecc46..5d61aaf 100644
--- a/recyclerview/recyclerview/api/current.txt
+++ b/recyclerview/recyclerview/api/current.txt
@@ -250,7 +250,7 @@
method public boolean getStackFromEnd();
method protected boolean isLayoutRTL();
method public boolean isSmoothScrollbarEnabled();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void prepareForDrop(android.view.View, android.view.View, int, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void prepareForDrop(android.view.View, android.view.View, int, int);
method public void scrollToPositionWithOffset(int, int);
method public void setInitialPrefetchItemCount(int);
method public void setOrientation(int);
diff --git a/recyclerview/recyclerview/api/res-1.1.0-alpha03.txt b/recyclerview/recyclerview/api/res-1.1.0-alpha03.txt
new file mode 100644
index 0000000..475bfc43
--- /dev/null
+++ b/recyclerview/recyclerview/api/res-1.1.0-alpha03.txt
@@ -0,0 +1,9 @@
+attr fastScrollEnabled
+attr fastScrollHorizontalThumbDrawable
+attr fastScrollHorizontalTrackDrawable
+attr fastScrollVerticalThumbDrawable
+attr fastScrollVerticalTrackDrawable
+attr layoutManager
+attr reverseLayout
+attr spanCount
+attr stackFromEnd
diff --git a/recyclerview/recyclerview/build.gradle b/recyclerview/recyclerview/build.gradle
index 60cca07..7747ae8 100644
--- a/recyclerview/recyclerview/build.gradle
+++ b/recyclerview/recyclerview/build.gradle
@@ -8,7 +8,7 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":annotation"))
api(project(":core"))
implementation("androidx.collection:collection:1.0.0")
api("androidx.customview:customview:1.0.0")
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearSmoothScrollerTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearSmoothScrollerTest.java
new file mode 100644
index 0000000..a7a70a3
--- /dev/null
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearSmoothScrollerTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.recyclerview.widget;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.util.DisplayMetrics;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LinearSmoothScrollerTest {
+
+ @Test
+ public void constructor_doesNotInvokeCalculateSpeedPerPixel() {
+ // As this method can be overridden by users of LinearSmoothScroller, it should
+ // not be invoked and cached in the constructor. Otherwise it might be called when
+ // the object is in a semi-initialized state.
+ final AtomicBoolean methodCalled = new AtomicBoolean(false);
+
+ LinearSmoothScroller scroller = new LinearSmoothScroller(
+ ApplicationProvider.getApplicationContext()) {
+
+ @Override
+ protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
+ methodCalled.set(true);
+ return super.calculateSpeedPerPixel(displayMetrics);
+ }
+ };
+
+ assertThat(methodCalled.get(), is(false));
+ }
+
+ @Test
+ public void calculateTimeForScrolling_cachesResultOfCalculateSpeedPerPixel() {
+ final AtomicInteger methodCalls = new AtomicInteger(0);
+ LinearSmoothScroller scroller = new LinearSmoothScroller(
+ ApplicationProvider.getApplicationContext()) {
+
+ @Override
+ protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
+ methodCalls.getAndIncrement();
+ return super.calculateSpeedPerPixel(displayMetrics);
+ }
+
+ // This method is protected by default. Make it public for test purposes.
+ @Override
+ public int calculateTimeForScrolling(int dx) {
+ return super.calculateTimeForScrolling(dx);
+ }
+ };
+
+ scroller.calculateTimeForScrolling(/*dx=*/ 10);
+ scroller.calculateTimeForScrolling(/*dx=*/ 100);
+ scroller.calculateTimeForScrolling(/*dx=*/ 1000);
+
+ assertThat(methodCalls.get(), is(1));
+ }
+}
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java
index 0abcd0f..44fdd46 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java
@@ -223,16 +223,13 @@
AccessibilityNodeInfo info = recyclerView.getChildAt(i)
.createAccessibilityNodeInfo();
assertTrue("custom delegate sets isChecked", info.isChecked());
- assertFalse(recyclerView.findContainingViewHolder(view).hasAnyOfTheFlags(
- RecyclerView.ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE));
assertTrue(delegateCompat.equals(ViewCompat.getAccessibilityDelegate(view)));
children.add(view);
}
}
});
- // invalidate and start layout at 50, all existing views will goes to recycler and
- // being reused.
+ // invalidate and start layout at 50, all existing views will go to recycler and be reused.
layoutStart[0] = 50;
layoutManager.expectLayouts(1);
adapter.dispatchDataSetChanged();
@@ -248,8 +245,6 @@
assertTrue(children.contains(view));
AccessibilityNodeInfo info = view.createAccessibilityNodeInfo();
assertTrue("custom delegate sets isChecked", info.isChecked());
- assertFalse(recyclerView.findContainingViewHolder(view).hasAnyOfTheFlags(
- RecyclerView.ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE));
assertTrue(delegateCompat.equals(ViewCompat.getAccessibilityDelegate(view)));
}
}
@@ -257,21 +252,21 @@
}
@Test
- public void clearItemDelegateWhenGoesToPool() throws Throwable {
+ public void setDefaultItemDelegate() throws Throwable {
final RecyclerView recyclerView = new RecyclerView(getActivity()) {
@Override
boolean isAccessibilityEnabled() {
return true;
}
};
- final int firstPassLayoutCount = 5;
- final int[] layoutCount = new int[] {firstPassLayoutCount};
+ final int[] layoutStart = new int[] {0};
+ final int layoutCount = 5;
final TestLayoutManager layoutManager = new TestLayoutManager() {
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
detachAndScrapAttachedViews(recycler);
removeAndRecycleScrapInt(recycler);
- layoutRange(recycler, 0, layoutCount[0]);
+ layoutRange(recycler, layoutStart[0], layoutStart[0] + layoutCount);
if (layoutLatch != null) {
layoutLatch.countDown();
}
@@ -279,6 +274,76 @@
};
final TestAdapter adapter = new TestAdapter(100);
layoutManager.expectLayouts(1);
+ recyclerView.setLayoutManager(layoutManager);
+ setRecyclerView(recyclerView);
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ recyclerView.setAdapter(adapter);
+ }
+ });
+ layoutManager.waitForLayout(1);
+
+ // Assert
+
+ // Sanity check
+ assertEquals(layoutCount, recyclerView.getChildCount());
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 0; i < recyclerView.getChildCount(); i++) {
+ View view = recyclerView.getChildAt(i);
+ // Sanity check
+ assertEquals(i, recyclerView.getChildAdapterPosition(view));
+ assertTrue(accessibiltyDelegateIsItemDelegate(recyclerView, view));
+ AccessibilityNodeInfo info = view.createAccessibilityNodeInfo();
+ if (Build.VERSION.SDK_INT >= 19) {
+ assertNotNull(info.getCollectionItemInfo());
+ }
+ }
+ }
+ });
+ }
+
+ @Test
+ public void notSetDefaultItemDelegateAfterCustomDelegateRemoval() throws Throwable {
+ final RecyclerView recyclerView = new RecyclerView(getActivity()) {
+ @Override
+ boolean isAccessibilityEnabled() {
+ return true;
+ }
+ };
+ final int[] layoutStart = new int[] {0};
+ final int layoutCount = 5;
+ final TestLayoutManager layoutManager = new TestLayoutManager() {
+ @Override
+ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+ detachAndScrapAttachedViews(recycler);
+ removeAndRecycleScrapInt(recycler);
+ layoutRange(recycler, layoutStart[0], layoutStart[0] + layoutCount);
+ if (layoutLatch != null) {
+ layoutLatch.countDown();
+ }
+ }
+ };
+ final AccessibilityDelegateCompat delegateCompat = new AccessibilityDelegateCompat() {
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host,
+ AccessibilityNodeInfoCompat info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ info.setChecked(true);
+ }
+ };
+ final TestAdapter adapter = new TestAdapter(100) {
+ @Override
+ public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+ int viewType) {
+ TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
+ ViewCompat.setAccessibilityDelegate(vh.itemView, delegateCompat);
+ return vh;
+ }
+ };
+ layoutManager.expectLayouts(1);
recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 100);
recyclerView.setItemViewCacheSize(0); // no cache, directly goes to pool
recyclerView.setLayoutManager(layoutManager);
@@ -291,44 +356,50 @@
});
layoutManager.waitForLayout(1);
- assertEquals(firstPassLayoutCount, recyclerView.getChildCount());
+ assertEquals(layoutCount, recyclerView.getChildCount());
+ final ArrayList<View> children = new ArrayList();
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < recyclerView.getChildCount(); i++) {
View view = recyclerView.getChildAt(i);
- assertEquals(i, recyclerView.getChildAdapterPosition(view));
- assertTrue(recyclerView.findContainingViewHolder(view).hasAnyOfTheFlags(
- RecyclerView.ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE));
- assertTrue(accessibiltyDelegateIsItemDelegate(recyclerView, view));
- AccessibilityNodeInfo info = view.createAccessibilityNodeInfo();
- if (Build.VERSION.SDK_INT >= 19) {
- assertNotNull(info.getCollectionItemInfo());
- }
+ assertEquals(layoutStart[0] + i,
+ recyclerView.getChildAdapterPosition(view));
+ AccessibilityNodeInfo info = recyclerView.getChildAt(i)
+ .createAccessibilityNodeInfo();
+ assertTrue("custom delegate sets isChecked", info.isChecked());
+ assertTrue(delegateCompat.equals(ViewCompat.getAccessibilityDelegate(view)));
+ children.add(view);
+
+ // remove item delegate
+ ViewCompat.setAccessibilityDelegate(view, null);
+
}
}
});
- // let all items go to recycler pool
+ // invalidate and start layout at 50, all existing views will go to recycler and be reused.
+ layoutStart[0] = 50;
layoutManager.expectLayouts(1);
- layoutCount[0] = 0;
- adapter.resetItemsTo(new ArrayList());
+ adapter.dispatchDataSetChanged();
layoutManager.waitForLayout(1);
- assertEquals(0, recyclerView.getChildCount());
- assertEquals(firstPassLayoutCount, recyclerView.getRecycledViewPool()
- .getRecycledViewCount(0));
+
+ // Assert
+
+ // Sanity check
+ assertEquals(layoutCount, recyclerView.getChildCount());
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
- for (int i = 0; i < firstPassLayoutCount; i++) {
- RecyclerView.ViewHolder vh = recyclerView.getRecycledViewPool()
- .getRecycledView(0);
- View view = vh.itemView;
- assertEquals(RecyclerView.NO_POSITION,
+ for (int i = 0; i < recyclerView.getChildCount(); i++) {
+ View view = recyclerView.getChildAt(i);
+ // Two sanity checks
+ assertEquals(layoutStart[0] + i,
recyclerView.getChildAdapterPosition(view));
- assertFalse(vh.hasAnyOfTheFlags(
- RecyclerView.ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE));
- assertFalse(accessibiltyDelegateIsItemDelegate(recyclerView, view));
+ assertTrue(children.contains(view));
+ AccessibilityNodeInfo info = view.createAccessibilityNodeInfo();
+ assertFalse("custom delegate sets isChecked", info.isChecked());
+ assertTrue(accessibiltyDelegateIsNotItemDelegate(recyclerView, view));
}
}
});
@@ -338,4 +409,10 @@
return rc.getCompatAccessibilityDelegate().getItemDelegate()
.equals(ViewCompat.getAccessibilityDelegate(item));
}
+
+ private boolean accessibiltyDelegateIsNotItemDelegate(RecyclerView rc, View item) {
+ AccessibilityDelegateCompat viewDelegate = ViewCompat.getAccessibilityDelegate(item);
+ return (viewDelegate != null && !rc.getCompatAccessibilityDelegate().getItemDelegate()
+ .equals(viewDelegate));
+ }
}
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java
index dbd9ee6..86956e2 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java
@@ -52,7 +52,7 @@
/** @hide */
@SuppressWarnings("WeakerAccess")
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Nullable
public Executor getMainThreadExecutor() {
return mMainThreadExecutor;
@@ -96,7 +96,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@NonNull
public Builder<T> setMainThreadExecutor(Executor executor) {
mMainThreadExecutor = executor;
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
index b76c636..0e5bda8 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
@@ -16,7 +16,7 @@
package androidx.recyclerview.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -2085,7 +2085,7 @@
/**
* @hide This method should be called by ItemTouchHelper only.
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void prepareForDrop(@NonNull View view, @NonNull View target, int x, int y) {
assertNotInLayoutOrScroll("Cannot drop a view during a scroll or layout calculation");
@@ -2304,7 +2304,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("BanParcelableUsage")
public static class SavedState implements Parcelable {
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java
index 095098a..37bb647 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java
@@ -82,14 +82,16 @@
protected PointF mTargetVector;
- private final float MILLISECONDS_PER_PX;
+ private final DisplayMetrics mDisplayMetrics;
+ private boolean mHasCalculatedMillisPerPixel = false;
+ private float mMillisPerPixel;
// Temporary variables to keep track of the interim scroll target. These values do not
// point to a real item position, rather point to an estimated location pixels.
protected int mInterimTargetDx = 0, mInterimTargetDy = 0;
public LinearSmoothScroller(Context context) {
- MILLISECONDS_PER_PX = calculateSpeedPerPixel(context.getResources().getDisplayMetrics());
+ mDisplayMetrics = context.getResources().getDisplayMetrics();
}
/**
@@ -153,6 +155,9 @@
/**
* Calculates the scroll speed.
*
+ * <p>By default, LinearSmoothScroller assumes this method always returns the same value and
+ * caches the result of calling it.
+ *
* @param displayMetrics DisplayMetrics to be used for real dimension calculations
* @return The time (in ms) it should take for each pixel. For instance, if returned value is
* 2 ms, it means scrolling 1000 pixels with LinearInterpolation should take 2 seconds.
@@ -161,6 +166,14 @@
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
+ private float getSpeedPerPixel() {
+ if (!mHasCalculatedMillisPerPixel) {
+ mMillisPerPixel = calculateSpeedPerPixel(mDisplayMetrics);
+ mHasCalculatedMillisPerPixel = true;
+ }
+ return mMillisPerPixel;
+ }
+
/**
* <p>Calculates the time for deceleration so that transition from LinearInterpolator to
* DecelerateInterpolator looks smooth.</p>
@@ -189,7 +202,7 @@
// In a case where dx is very small, rounding may return 0 although dx > 0.
// To avoid that issue, ceil the result so that if dx > 0, we'll always return positive
// time.
- return (int) Math.ceil(Math.abs(dx) * MILLISECONDS_PER_PX);
+ return (int) Math.ceil(Math.abs(dx) * getSpeedPerPixel());
}
/**
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 3b8b449..2b6662f 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -17,7 +17,7 @@
package androidx.recyclerview.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.view.ViewCompat.TYPE_NON_TOUCH;
import static androidx.core.view.ViewCompat.TYPE_TOUCH;
@@ -262,7 +262,7 @@
static final boolean DISPATCH_TEMP_DETACH = false;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({HORIZONTAL, VERTICAL})
@Retention(RetentionPolicy.SOURCE)
public @interface Orientation {}
@@ -5894,7 +5894,7 @@
mAdapter.bindViewHolder(holder, offsetPosition);
long endBindNs = getNanoTime();
mRecyclerPool.factorInBindTime(holder.getItemViewType(), endBindNs - startBindNs);
- attachAccessibilityDelegateOnBind(holder);
+ setAccessibilityImportantOnBind(holder);
if (mState.isPreLayout()) {
holder.mPreLayoutPosition = position;
}
@@ -6115,6 +6115,10 @@
return null;
}
holder = mAdapter.createViewHolder(RecyclerView.this, type);
+ if (!ViewCompat.hasAccessibilityDelegate(holder.itemView)) {
+ ViewCompat.setAccessibilityDelegate(holder.itemView,
+ mAccessibilityDelegate.getItemDelegate());
+ }
if (ALLOW_THREAD_GAP_WORK) {
// only bother finding nested RV if prefetching
RecyclerView innerView = findNestedRecyclerView(holder.itemView);
@@ -6177,7 +6181,7 @@
return holder;
}
- private void attachAccessibilityDelegateOnBind(ViewHolder holder) {
+ private void setAccessibilityImportantOnBind(ViewHolder holder) {
if (isAccessibilityEnabled()) {
final View itemView = holder.itemView;
if (ViewCompat.getImportantForAccessibility(itemView)
@@ -6185,11 +6189,6 @@
ViewCompat.setImportantForAccessibility(itemView,
ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
- if (!ViewCompat.hasAccessibilityDelegate(itemView)) {
- holder.addFlags(ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE);
- ViewCompat.setAccessibilityDelegate(itemView,
- mAccessibilityDelegate.getItemDelegate());
- }
}
}
@@ -6398,10 +6397,6 @@
*/
void addViewHolderToRecycledViewPool(@NonNull ViewHolder holder, boolean dispatchRecycled) {
clearNestedRecyclerViewIfNotNested(holder);
- if (holder.hasAnyOfTheFlags(ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE)) {
- holder.setFlags(0, ViewHolder.FLAG_SET_A11Y_ITEM_DELEGATE);
- ViewCompat.setAccessibilityDelegate(holder.itemView, null);
- }
if (dispatchRecycled) {
dispatchViewRecycled(holder);
}
@@ -10919,12 +10914,6 @@
*/
static final int FLAG_BOUNCED_FROM_HIDDEN_LIST = 1 << 13;
- /**
- * Flags that RecyclerView assigned {@link RecyclerViewAccessibilityDelegate
- * #getItemDelegate()} in onBindView when app does not provide a delegate.
- */
- static final int FLAG_SET_A11Y_ITEM_DELEGATE = 1 << 14;
-
int mFlags;
private static final List<Object> FULLUPDATE_PAYLOADS = Collections.emptyList();
@@ -12168,7 +12157,7 @@
* This is public so that the CREATOR can be accessed on cold launch.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class SavedState extends AbsSavedState {
Parcelable mLayoutState;
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java
index 17e4293..de9f022 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java
@@ -17,7 +17,7 @@
package androidx.recyclerview.widget;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -3147,7 +3147,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("BanParcelableUsage")
public static class SavedState implements Parcelable {
diff --git a/recyclerview/selection/api/1.1.0-alpha03.txt b/recyclerview/selection/api/1.1.0-alpha03.txt
new file mode 100644
index 0000000..1b682ce
--- /dev/null
+++ b/recyclerview/selection/api/1.1.0-alpha03.txt
@@ -0,0 +1,158 @@
+// Signature format: 3.0
+package androidx.recyclerview.selection {
+
+ public abstract class BandPredicate {
+ ctor public BandPredicate();
+ method public abstract boolean canInitiate(android.view.MotionEvent!);
+ }
+
+ public static final class BandPredicate.EmptyArea extends androidx.recyclerview.selection.BandPredicate {
+ ctor public BandPredicate.EmptyArea(androidx.recyclerview.widget.RecyclerView);
+ method public boolean canInitiate(android.view.MotionEvent);
+ }
+
+ public static final class BandPredicate.NonDraggableArea extends androidx.recyclerview.selection.BandPredicate {
+ ctor public BandPredicate.NonDraggableArea(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.selection.ItemDetailsLookup);
+ method public boolean canInitiate(android.view.MotionEvent);
+ }
+
+ public abstract class FocusDelegate<K> {
+ ctor public FocusDelegate();
+ method public abstract void clearFocus();
+ method public abstract void focusItem(androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails<K>);
+ method public abstract int getFocusedPosition();
+ method public abstract boolean hasFocusedItem();
+ }
+
+ public abstract class ItemDetailsLookup<K> {
+ ctor public ItemDetailsLookup();
+ method public abstract androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails<K>? getItemDetails(android.view.MotionEvent);
+ }
+
+ public abstract static class ItemDetailsLookup.ItemDetails<K> {
+ ctor public ItemDetailsLookup.ItemDetails();
+ method public abstract int getPosition();
+ method public abstract K? getSelectionKey();
+ method public boolean hasSelectionKey();
+ method public boolean inDragRegion(android.view.MotionEvent);
+ method public boolean inSelectionHotspot(android.view.MotionEvent);
+ }
+
+ public abstract class ItemKeyProvider<K> {
+ ctor protected ItemKeyProvider(@androidx.recyclerview.selection.ItemKeyProvider.Scope int);
+ method public abstract K? getKey(int);
+ method public abstract int getPosition(K);
+ field public static final int SCOPE_CACHED = 1; // 0x1
+ field public static final int SCOPE_MAPPED = 0; // 0x0
+ }
+
+ @IntDef({androidx.recyclerview.selection.ItemKeyProvider.SCOPE_MAPPED, androidx.recyclerview.selection.ItemKeyProvider.SCOPE_CACHED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ItemKeyProvider.Scope {
+ }
+
+ public final class MutableSelection<K> extends androidx.recyclerview.selection.Selection<K> {
+ ctor public MutableSelection();
+ method public boolean add(K);
+ method public void clear();
+ method public void copyFrom(androidx.recyclerview.selection.Selection<K>);
+ method public boolean remove(K);
+ }
+
+ public interface OnContextClickListener {
+ method public boolean onContextClick(android.view.MotionEvent);
+ }
+
+ public interface OnDragInitiatedListener {
+ method public boolean onDragInitiated(android.view.MotionEvent);
+ }
+
+ public interface OnItemActivatedListener<K> {
+ method public boolean onItemActivated(androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails<K>, android.view.MotionEvent);
+ }
+
+ public final class OperationMonitor {
+ ctor public OperationMonitor();
+ method public void addListener(androidx.recyclerview.selection.OperationMonitor.OnChangeListener);
+ method public boolean isStarted();
+ method public void removeListener(androidx.recyclerview.selection.OperationMonitor.OnChangeListener);
+ }
+
+ public static interface OperationMonitor.OnChangeListener {
+ method public void onChanged();
+ }
+
+ public class Selection<K> implements java.lang.Iterable<K> {
+ method public boolean contains(K?);
+ method public boolean isEmpty();
+ method public java.util.Iterator<K>! iterator();
+ method public int size();
+ }
+
+ public final class SelectionPredicates {
+ method public static <K> androidx.recyclerview.selection.SelectionTracker.SelectionPredicate<K>! createSelectAnything();
+ method public static <K> androidx.recyclerview.selection.SelectionTracker.SelectionPredicate<K>! createSelectSingleAnything();
+ }
+
+ public abstract class SelectionTracker<K> {
+ ctor public SelectionTracker();
+ method public abstract void addObserver(androidx.recyclerview.selection.SelectionTracker.SelectionObserver!);
+ method public abstract boolean clearSelection();
+ method public abstract void copySelection(androidx.recyclerview.selection.MutableSelection<K>);
+ method public abstract boolean deselect(K);
+ method public abstract androidx.recyclerview.selection.Selection<K>! getSelection();
+ method public abstract boolean hasSelection();
+ method public abstract boolean isSelected(K?);
+ method public abstract void onRestoreInstanceState(android.os.Bundle?);
+ method public abstract void onSaveInstanceState(android.os.Bundle);
+ method protected abstract void restoreSelection(androidx.recyclerview.selection.Selection<K>);
+ method public abstract boolean select(K);
+ method public abstract boolean setItemsSelected(Iterable<K>, boolean);
+ field public static final String SELECTION_CHANGED_MARKER = "Selection-Changed";
+ }
+
+ public static final class SelectionTracker.Builder<K> {
+ ctor public SelectionTracker.Builder(String, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.selection.ItemKeyProvider<K>, androidx.recyclerview.selection.ItemDetailsLookup<K>, androidx.recyclerview.selection.StorageStrategy<K>);
+ method public androidx.recyclerview.selection.SelectionTracker<K>! build();
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withBandOverlay(@DrawableRes int);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withBandPredicate(androidx.recyclerview.selection.BandPredicate);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withFocusDelegate(androidx.recyclerview.selection.FocusDelegate<K>);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withGestureTooltypes(int...!);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withOnContextClickListener(androidx.recyclerview.selection.OnContextClickListener);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withOnDragInitiatedListener(androidx.recyclerview.selection.OnDragInitiatedListener);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withOnItemActivatedListener(androidx.recyclerview.selection.OnItemActivatedListener<K>);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withOperationMonitor(androidx.recyclerview.selection.OperationMonitor);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withPointerTooltypes(int...!);
+ method public androidx.recyclerview.selection.SelectionTracker.Builder<K>! withSelectionPredicate(androidx.recyclerview.selection.SelectionTracker.SelectionPredicate<K>);
+ }
+
+ public abstract static class SelectionTracker.SelectionObserver<K> {
+ ctor public SelectionTracker.SelectionObserver();
+ method public void onItemStateChanged(K, boolean);
+ method public void onSelectionChanged();
+ method public void onSelectionRefresh();
+ method public void onSelectionRestored();
+ }
+
+ public abstract static class SelectionTracker.SelectionPredicate<K> {
+ ctor public SelectionTracker.SelectionPredicate();
+ method public abstract boolean canSelectMultiple();
+ method public abstract boolean canSetStateAtPosition(int, boolean);
+ method public abstract boolean canSetStateForKey(K, boolean);
+ }
+
+ public final class StableIdKeyProvider extends androidx.recyclerview.selection.ItemKeyProvider<java.lang.Long> {
+ ctor public StableIdKeyProvider(androidx.recyclerview.widget.RecyclerView);
+ method public Long? getKey(int);
+ method public int getPosition(Long);
+ }
+
+ public abstract class StorageStrategy<K> {
+ ctor public StorageStrategy(Class<K>);
+ method public abstract android.os.Bundle asBundle(androidx.recyclerview.selection.Selection<K>);
+ method public abstract androidx.recyclerview.selection.Selection<K>? asSelection(android.os.Bundle);
+ method public static androidx.recyclerview.selection.StorageStrategy<java.lang.Long>! createLongStorage();
+ method public static <K extends android.os.Parcelable> androidx.recyclerview.selection.StorageStrategy<K>! createParcelableStorage(Class<K>!);
+ method public static androidx.recyclerview.selection.StorageStrategy<java.lang.String>! createStringStorage();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/recyclerview/selection/api/res-1.1.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to recyclerview/selection/api/res-1.1.0-alpha03.txt
diff --git a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/AutoScroller.java b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/AutoScroller.java
index c3112c4..e55f630 100644
--- a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/AutoScroller.java
+++ b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/AutoScroller.java
@@ -16,7 +16,7 @@
package androidx.recyclerview.selection;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Point;
@@ -28,7 +28,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class AutoScroller {
/**
diff --git a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
index 0635f91..007c982 100644
--- a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
+++ b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
@@ -16,7 +16,7 @@
package androidx.recyclerview.selection;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.util.Preconditions.checkArgument;
import static androidx.core.util.Preconditions.checkState;
import static androidx.recyclerview.selection.Shared.DEBUG;
@@ -49,7 +49,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class DefaultSelectionTracker<K> extends SelectionTracker<K> {
private static final String TAG = "DefaultSelectionTracker";
diff --git a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/EventBridge.java b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/EventBridge.java
index 6c43f7e..b06868fd 100644
--- a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/EventBridge.java
+++ b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/EventBridge.java
@@ -16,7 +16,7 @@
package androidx.recyclerview.selection;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.annotation.VisibleForTesting.PACKAGE_PRIVATE;
import static androidx.core.util.Preconditions.checkArgument;
import static androidx.recyclerview.selection.Shared.VERBOSE;
@@ -38,7 +38,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@VisibleForTesting(otherwise = PACKAGE_PRIVATE)
public class EventBridge {
diff --git a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
index d032e2b..a5187b4 100644
--- a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
+++ b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
@@ -16,7 +16,7 @@
package androidx.recyclerview.selection;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.view.MotionEvent;
@@ -72,7 +72,7 @@
* @return true if there is an item w/ a stable ID at the event coordinates.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected boolean overItemWithSelectionKey(@NonNull MotionEvent e) {
return overItem(e) && hasSelectionKey(getItemDetails(e));
}
diff --git a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
index 56d4328..bd63fd6 100644
--- a/recyclerview/selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
+++ b/recyclerview/selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
@@ -16,7 +16,7 @@
package androidx.recyclerview.selection;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.util.Preconditions.checkArgument;
import android.content.Context;
@@ -180,7 +180,7 @@
public abstract boolean deselect(@NonNull K key);
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected abstract AdapterDataObserver getAdapterDataObserver();
/**
@@ -192,7 +192,7 @@
* work with the established anchor point to define selection ranges.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract void startRange(int position);
/**
@@ -208,7 +208,7 @@
* must have been started by a call to {@link #startRange(int)}.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract void extendRange(int position);
/**
@@ -217,14 +217,14 @@
* {@link #mergeProvisionalSelection()} is called first.)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract void endRange();
/**
* @return Whether or not there is a current range selection active.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract boolean isRangeActive();
/**
@@ -237,7 +237,7 @@
* @param position the anchor position. Must already be selected.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract void anchorRange(int position);
/**
@@ -246,7 +246,7 @@
* @param position the end point.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected abstract void extendProvisionalRange(int position);
/**
@@ -254,14 +254,14 @@
* @param newSelection
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected abstract void setProvisionalSelection(@NonNull Set<K> newSelection);
/**
* Clears any existing provisional selection
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected abstract void clearProvisionalSelection();
/**
@@ -269,7 +269,7 @@
* provisional selection.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected abstract void mergeProvisionalSelection();
/**
diff --git a/remotecallback/build.gradle b/remotecallback/build.gradle
index f3eb6e9..4f9ffe3 100644
--- a/remotecallback/build.gradle
+++ b/remotecallback/build.gradle
@@ -24,7 +24,7 @@
}
dependencies {
- implementation "androidx.annotation:annotation:1.0.0"
+ implementation project(":annotation")
implementation project(path: ':collection')
androidTestImplementation(TEST_EXT_JUNIT)
diff --git a/remotecallback/src/main/java/androidx/remotecallback/AppWidgetProviderWithCallbacks.java b/remotecallback/src/main/java/androidx/remotecallback/AppWidgetProviderWithCallbacks.java
index a1c1d92..48f1db9 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/AppWidgetProviderWithCallbacks.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/AppWidgetProviderWithCallbacks.java
@@ -53,7 +53,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public RemoteCallback toRemoteCallback(Class<T> cls, Context context, String authority,
Bundle args, String method) {
diff --git a/remotecallback/src/main/java/androidx/remotecallback/BroadcastReceiverWithCallbacks.java b/remotecallback/src/main/java/androidx/remotecallback/BroadcastReceiverWithCallbacks.java
index 87e0f56..8ef1a1e 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/BroadcastReceiverWithCallbacks.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/BroadcastReceiverWithCallbacks.java
@@ -59,7 +59,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public RemoteCallback toRemoteCallback(Class<T> cls, Context context, String authority,
Bundle args, String method) {
diff --git a/remotecallback/src/main/java/androidx/remotecallback/CallbackBase.java b/remotecallback/src/main/java/androidx/remotecallback/CallbackBase.java
index 9d2aa7e..c12453e 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/CallbackBase.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/CallbackBase.java
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public interface CallbackBase<T> {
/**
@@ -38,7 +38,7 @@
* be used in the context on {@link CallbackReceiver#createRemoteCallback}.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
RemoteCallback toRemoteCallback(Class<T> cls, Context context, String authority, Bundle args,
String method);
}
diff --git a/remotecallback/src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java b/remotecallback/src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java
index 67ca076..4dc9b72 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java
@@ -41,7 +41,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static final CallbackHandlerRegistry sInstance = new CallbackHandlerRegistry();
private static final String TAG = "CallbackHandlerRegistry";
@@ -52,7 +52,7 @@
* @hide
*/
@SuppressWarnings("TypeParameterUnusedInFormals")
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public <T extends CallbackReceiver> T getAndResetStub(Class<? extends CallbackReceiver> cls,
Context context, String authority) {
ensureInitialized(cls);
diff --git a/remotecallback/src/main/java/androidx/remotecallback/ContentProviderWithCallbacks.java b/remotecallback/src/main/java/androidx/remotecallback/ContentProviderWithCallbacks.java
index e728f80..5b862ed 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/ContentProviderWithCallbacks.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/ContentProviderWithCallbacks.java
@@ -66,7 +66,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public RemoteCallback toRemoteCallback(Class<T> cls, Context context, String authority,
Bundle args, String method) {
diff --git a/remotecallback/src/main/java/androidx/remotecallback/ProviderRelayReceiver.java b/remotecallback/src/main/java/androidx/remotecallback/ProviderRelayReceiver.java
index 2bf7a41..a289e2a 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/ProviderRelayReceiver.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/ProviderRelayReceiver.java
@@ -29,7 +29,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ProviderRelayReceiver extends BroadcastReceiver {
public static final String ACTION_PROVIDER_RELAY =
diff --git a/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java b/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java
index 1e4387e..e2e8c4b 100644
--- a/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java
+++ b/remotecallback/src/main/java/androidx/remotecallback/RemoteCallback.java
@@ -39,7 +39,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static final String EXTRA_METHOD = "remotecallback.method";
/**
@@ -70,7 +70,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public RemoteCallback(@NonNull Context context,
@RemoteCallbackType int type,
@NonNull Intent intent,
diff --git a/room/common/build.gradle b/room/common/build.gradle
index 1bf6652..4542fd3 100644
--- a/room/common/build.gradle
+++ b/room/common/build.gradle
@@ -24,7 +24,7 @@
}
dependencies {
- compile(SUPPORT_ANNOTATIONS)
+ compile(project(":annotation"))
testCompile(JUNIT)
testCompile(MOCKITO_CORE)
}
diff --git a/room/common/src/main/java/androidx/room/RoomMasterTable.java b/room/common/src/main/java/androidx/room/RoomMasterTable.java
index c1ab82a..f116366 100644
--- a/room/common/src/main/java/androidx/room/RoomMasterTable.java
+++ b/room/common/src/main/java/androidx/room/RoomMasterTable.java
@@ -24,7 +24,7 @@
* @hide
*/
@SuppressWarnings("WeakerAccess")
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class RoomMasterTable {
/**
* The master table where room keeps its metadata information.
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
index 962caa5..74b084f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
@@ -47,7 +47,7 @@
}
override fun executeAndReturn(
- stmtQueryVal: String,
+ prepareQueryStmtBlock: CodeGenScope.() -> String,
preparedStmtField: String?,
dbField: FieldSpec,
scope: CodeGenScope
@@ -55,7 +55,7 @@
val binderScope = scope.fork()
val callableImpl = CallableTypeSpecBuilder(returnType.typeName()) {
adapter?.executeAndReturn(
- stmtQueryVal,
+ binderScope.prepareQueryStmtBlock(),
preparedStmtField,
dbField,
binderScope)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/InstantPreparedQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/InstantPreparedQueryResultBinder.kt
index 3e2b6ad..53887ce 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/InstantPreparedQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/InstantPreparedQueryResultBinder.kt
@@ -27,13 +27,13 @@
: PreparedQueryResultBinder(adapter) {
override fun executeAndReturn(
- stmtQueryVal: String,
+ prepareQueryStmtBlock: CodeGenScope.() -> String,
preparedStmtField: String?,
dbField: FieldSpec,
scope: CodeGenScope
) {
adapter?.executeAndReturn(
- stmtQueryVal = stmtQueryVal,
+ stmtQueryVal = scope.prepareQueryStmtBlock(),
preparedStmtField = preparedStmtField,
dbField = dbField,
scope = scope)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/PreparedQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/PreparedQueryResultBinder.kt
index 1128c58..4abb792 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/PreparedQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/PreparedQueryResultBinder.kt
@@ -29,10 +29,11 @@
*/
abstract class PreparedQueryResultBinder(val adapter: PreparedQueryResultAdapter?) {
/**
- * Receives a prepared query to generate the code to run the query and return the result
+ * Receives a function that will prepare the query in a given scope to then generate the code
+ * that runs the query and returns the result.
*/
abstract fun executeAndReturn(
- stmtQueryVal: String,
+ prepareQueryStmtBlock: CodeGenScope.() -> String,
preparedStmtField: String?, // null when the query is not shared
dbField: FieldSpec,
scope: CodeGenScope
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
index 8fc4d9d..e5bf595 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
@@ -143,23 +143,22 @@
queryWriter: QueryWriter
): MethodSpec {
val scope = CodeGenScope(this)
- val methodBuilder = overrideWithoutAnnotations(method.element, declaredDao).apply {
- val stmtName = scope.getTmpVar("_stmt")
- addStatement("final $T $L = $N.acquire()",
- SupportDbTypeNames.SQLITE_STMT, stmtName, preparedStmtField)
- val bindScope = scope.fork()
- queryWriter.bindArgs(stmtName, emptyList(), bindScope)
- addCode(bindScope.builder().build())
-
- val binderScope = scope.fork()
- method.preparedQueryResultBinder.executeAndReturn(
- stmtQueryVal = stmtName,
- preparedStmtField = preparedStmtField.name,
- dbField = dbField,
- scope = binderScope)
- addCode(binderScope.builder().build())
- }
- return methodBuilder.build()
+ method.preparedQueryResultBinder.executeAndReturn(
+ prepareQueryStmtBlock = {
+ val stmtName = getTmpVar("_stmt")
+ builder().apply {
+ addStatement("final $T $L = $N.acquire()",
+ SupportDbTypeNames.SQLITE_STMT, stmtName, preparedStmtField)
+ }
+ queryWriter.bindArgs(stmtName, emptyList(), this)
+ stmtName
+ },
+ preparedStmtField = preparedStmtField.name,
+ dbField = dbField,
+ scope = scope)
+ return overrideWithoutAnnotations(method.element, declaredDao)
+ .addCode(scope.generate())
+ .build()
}
private fun createTransactionMethods(): List<PreparedStmtQuery> {
@@ -434,25 +433,26 @@
}
private fun createPreparedQueryMethodBody(method: WriteQueryMethod): CodeBlock {
- val queryWriter = QueryWriter(method)
val scope = CodeGenScope(this)
- val sqlVar = scope.getTmpVar("_sql")
- val stmtVar = scope.getTmpVar("_stmt")
- val listSizeArgs = queryWriter.prepareQuery(sqlVar, scope)
- scope.builder().apply {
- addStatement("final $T $L = $N.compileStatement($L)",
- SupportDbTypeNames.SQLITE_STMT, stmtVar, dbField, sqlVar)
- queryWriter.bindArgs(stmtVar, listSizeArgs, scope)
-
- val binderScope = scope.fork()
- method.preparedQueryResultBinder.executeAndReturn(
- stmtQueryVal = stmtVar,
- preparedStmtField = null,
- dbField = dbField,
- scope = binderScope)
- add(binderScope.builder().build())
- }
- return scope.builder().build()
+ method.preparedQueryResultBinder.executeAndReturn(
+ prepareQueryStmtBlock = {
+ val queryWriter = QueryWriter(method)
+ val sqlVar = getTmpVar("_sql")
+ val stmtVar = getTmpVar("_stmt")
+ val listSizeArgs = queryWriter.prepareQuery(sqlVar, this)
+ builder().apply {
+ addStatement(
+ "final $T $L = $N.compileStatement($L)",
+ SupportDbTypeNames.SQLITE_STMT, stmtVar, dbField, sqlVar
+ )
+ }
+ queryWriter.bindArgs(stmtVar, listSizeArgs, this)
+ stmtVar
+ },
+ preparedStmtField = null,
+ dbField = dbField,
+ scope = scope)
+ return scope.generate()
}
private fun createQueryMethodBody(method: ReadQueryMethod): CodeBlock {
diff --git a/room/compiler/src/test/data/daoWriter/output/DeletionDao.java b/room/compiler/src/test/data/daoWriter/output/DeletionDao.java
index cffa0e9..3088994 100644
--- a/room/compiler/src/test/data/daoWriter/output/DeletionDao.java
+++ b/room/compiler/src/test/data/daoWriter/output/DeletionDao.java
@@ -277,12 +277,12 @@
@Override
public Completable deleteByUidCompletable(final int uid) {
- final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteByUid.acquire();
- int _argIndex = 1;
- _stmt.bindLong(_argIndex, uid);
return Completable.fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteByUid.acquire();
+ int _argIndex = 1;
+ _stmt.bindLong(_argIndex, uid);
__db.beginTransaction();
try {
_stmt.executeUpdateDelete();
@@ -298,12 +298,12 @@
@Override
public Single<Integer> deleteByUidSingle(final int uid) {
- final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteByUid.acquire();
- int _argIndex = 1;
- _stmt.bindLong(_argIndex, uid);
return Single.fromCallable(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteByUid.acquire();
+ int _argIndex = 1;
+ _stmt.bindLong(_argIndex, uid);
__db.beginTransaction();
try {
final java.lang.Integer _result = _stmt.executeUpdateDelete();
@@ -319,12 +319,12 @@
@Override
public Maybe<Integer> deleteByUidMaybe(final int uid) {
- final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteByUid.acquire();
- int _argIndex = 1;
- _stmt.bindLong(_argIndex, uid);
return Maybe.fromCallable(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteByUid.acquire();
+ int _argIndex = 1;
+ _stmt.bindLong(_argIndex, uid);
__db.beginTransaction();
try {
final java.lang.Integer _result = _stmt.executeUpdateDelete();
diff --git a/room/compiler/src/test/data/daoWriter/output/UpdateDao.java b/room/compiler/src/test/data/daoWriter/output/UpdateDao.java
index de385b8..336c56e 100644
--- a/room/compiler/src/test/data/daoWriter/output/UpdateDao.java
+++ b/room/compiler/src/test/data/daoWriter/output/UpdateDao.java
@@ -326,10 +326,10 @@
@Override
public Completable ageUserAllCompletable() {
- final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
return Completable.fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
__db.beginTransaction();
try {
_stmt.executeUpdateDelete();
@@ -345,10 +345,10 @@
@Override
public Single<Integer> ageUserAllSingle() {
- final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
return Single.fromCallable(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
__db.beginTransaction();
try {
final java.lang.Integer _result = _stmt.executeUpdateDelete();
@@ -364,10 +364,10 @@
@Override
public Maybe<Integer> ageUserAllMaybe() {
- final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
return Maybe.fromCallable(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
+ final SupportSQLiteStatement _stmt = __preparedStmtOfAgeUserAll.acquire();
__db.beginTransaction();
try {
final java.lang.Integer _result = _stmt.executeUpdateDelete();
diff --git a/room/coroutines/src/main/java/androidx/room/CoroutinesRoom.kt b/room/coroutines/src/main/java/androidx/room/CoroutinesRoom.kt
index 5e166ab..c84c657 100644
--- a/room/coroutines/src/main/java/androidx/room/CoroutinesRoom.kt
+++ b/room/coroutines/src/main/java/androidx/room/CoroutinesRoom.kt
@@ -26,7 +26,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
class CoroutinesRoom {
companion object {
diff --git a/room/guava/build.gradle b/room/guava/build.gradle
index 92c6e15..6d8d92d 100644
--- a/room/guava/build.gradle
+++ b/room/guava/build.gradle
@@ -32,6 +32,7 @@
api(SUPPORT_ANNOTATIONS, libs.support_exclude_config)
api(GUAVA_ANDROID)
+ api(GUAVA_LISTENABLE_FUTURE)
}
supportLibrary {
diff --git a/room/guava/src/main/java/androidx/room/guava/GuavaRoom.java b/room/guava/src/main/java/androidx/room/guava/GuavaRoom.java
index 60a073f..d4f6c2f 100644
--- a/room/guava/src/main/java/androidx/room/guava/GuavaRoom.java
+++ b/room/guava/src/main/java/androidx/room/guava/GuavaRoom.java
@@ -37,7 +37,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@SuppressWarnings("unused") // Used in GuavaListenableFutureQueryResultBinder code generation.
@SuppressLint("RestrictedAPI") // ArchTaskExecutor can only be called from androidx.arch.core
public class GuavaRoom {
diff --git a/room/integration-tests/autovaluetestapp/build.gradle b/room/integration-tests/autovaluetestapp/build.gradle
index 97a93be..e55b5dc 100644
--- a/room/integration-tests/autovaluetestapp/build.gradle
+++ b/room/integration-tests/autovaluetestapp/build.gradle
@@ -26,7 +26,7 @@
implementation(project(":sqlite:sqlite"))
implementation(project(":sqlite:sqlite-framework"))
implementation(project(":room:room-runtime"))
- implementation(ARCH_CORE_RUNTIME)
+ implementation(project(":arch:core-runtime"))
implementation(ARCH_LIFECYCLE_EXTENSIONS)
androidTestAnnotationProcessor project(":room:room-compiler")
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index 9aedad7..888bd09 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -44,8 +44,8 @@
implementation(project(":sqlite:sqlite"))
implementation(project(":sqlite:sqlite-framework"))
implementation(project(":room:room-runtime"))
- implementation(ARCH_CORE_RUNTIME)
- implementation(ARCH_LIFECYCLE_EXTENSIONS)
+ implementation(project(":arch:core-runtime"))
+ implementation(project(":lifecycle:lifecycle-extensions"))
implementation(KOTLIN_STDLIB)
implementation(KOTLIN_COROUTINES)
kaptAndroidTest project(":room:room-compiler")
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/RxJava2QueryTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
index f55b616..4f7db1b 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
@@ -19,6 +19,8 @@
import androidx.room.EmptyResultSetException
import androidx.room.integration.kotlintestapp.vo.BookWithPublisher
import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import io.reactivex.schedulers.Schedulers
import org.junit.Test
@SmallTest
@@ -112,4 +114,22 @@
it.books?.get(1) == TestUtil.BOOK_2
}
}
+
+ @Test
+ fun mainThreadSubscribe_sharedPreparedQuery() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync {
+ booksDao.insertPublisherCompletable("a1", "author1")
+ .subscribeOn(Schedulers.io())
+ .blockingAwait()
+ }
+ }
+
+ @Test
+ fun mainThreadSubscribe_preparedQuery() {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync {
+ booksDao.deleteBookWithIdsSingle("b1", "b2")
+ .subscribeOn(Schedulers.io())
+ .blockingGet()
+ }
+ }
}
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index 93a77c8..67bfa91 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -40,8 +40,8 @@
implementation(project(":room:room-runtime"))
implementation(project(":sqlite:sqlite"))
implementation(project(":sqlite:sqlite-framework"))
- implementation(ARCH_CORE_RUNTIME)
- implementation(ARCH_LIFECYCLE_EXTENSIONS)
+ implementation(project(":arch:core-runtime"))
+ implementation(project(":lifecycle:lifecycle-extensions"))
// FINDBUGS dependency resolves an app/testapp version conflict.
implementation(FINDBUGS)
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/BundleUtil.java b/room/migration/src/main/java/androidx/room/migration/bundle/BundleUtil.java
index 013fc45..7d5a77a 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/BundleUtil.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/BundleUtil.java
@@ -23,7 +23,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class BundleUtil {
/**
* Placeholder for table names in queries.
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseBundle.java
index 23b36f5..2f23737 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseBundle.java
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class DatabaseBundle implements SchemaEquality<DatabaseBundle> {
@SerializedName("version")
private int mVersion;
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseViewBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseViewBundle.java
index bc88b45..e6741f3 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseViewBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/DatabaseViewBundle.java
@@ -26,7 +26,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class DatabaseViewBundle implements SchemaEquality<DatabaseViewBundle> {
@SerializedName("viewName")
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/EntityBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/EntityBundle.java
index 09034d9..04aa4f6 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/EntityBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/EntityBundle.java
@@ -36,7 +36,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class EntityBundle implements SchemaEquality<EntityBundle> {
static final String NEW_TABLE_PREFIX = "_new_";
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
index c6612f4..cb7c03f 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
@@ -26,7 +26,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class FieldBundle implements SchemaEquality<FieldBundle> {
@SerializedName("fieldPath")
private String mFieldPath;
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/ForeignKeyBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/ForeignKeyBundle.java
index 3d45900..cb6f7b7 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/ForeignKeyBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/ForeignKeyBundle.java
@@ -27,7 +27,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ForeignKeyBundle implements SchemaEquality<ForeignKeyBundle> {
@SerializedName("table")
private String mTable;
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.java
index d1fadf7..8bf86e7 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.java
@@ -35,7 +35,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class FtsEntityBundle extends EntityBundle {
private static final String [] SHADOW_TABLE_NAME_SUFFIXES = {
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/FtsOptionsBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/FtsOptionsBundle.java
index 05a68ae..1cc3736 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/FtsOptionsBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/FtsOptionsBundle.java
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class FtsOptionsBundle implements SchemaEquality<FtsOptionsBundle> {
@SerializedName("tokenizer")
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/IndexBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/IndexBundle.java
index baf15ab..9a970d0 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/IndexBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/IndexBundle.java
@@ -27,7 +27,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class IndexBundle implements SchemaEquality<IndexBundle> {
// should match Index.kt
public static final String DEFAULT_PREFIX = "index_";
@@ -63,7 +63,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public String create(String tableName) {
return BundleUtil.replaceTableName(mCreateSql, tableName);
}
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/PrimaryKeyBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/PrimaryKeyBundle.java
index a77da7d..99955a7 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/PrimaryKeyBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/PrimaryKeyBundle.java
@@ -27,7 +27,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class PrimaryKeyBundle implements SchemaEquality<PrimaryKeyBundle> {
@SerializedName("columnNames")
private List<String> mColumnNames;
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java
index 190eb0e..beb2c5e 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java
@@ -43,7 +43,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class SchemaBundle implements SchemaEquality<SchemaBundle> {
@SerializedName("formatVersion")
@@ -80,7 +80,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static SchemaBundle deserialize(InputStream fis)
throws UnsupportedEncodingException {
InputStreamReader is = new InputStreamReader(fis, CHARSET);
@@ -95,7 +95,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static void serialize(SchemaBundle bundle, File file) throws IOException {
FileOutputStream fos = new FileOutputStream(file, false);
OutputStreamWriter osw = new OutputStreamWriter(fos, CHARSET);
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/SchemaEquality.java b/room/migration/src/main/java/androidx/room/migration/bundle/SchemaEquality.java
index d300fea..bd1106d3 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/SchemaEquality.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/SchemaEquality.java
@@ -24,7 +24,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
interface SchemaEquality<T> {
boolean isSchemaEqual(T other);
}
diff --git a/room/runtime/build.gradle b/room/runtime/build.gradle
index 5323a81..38f4c29 100644
--- a/room/runtime/build.gradle
+++ b/room/runtime/build.gradle
@@ -34,7 +34,7 @@
api(project(":room:room-common"))
api(project(":sqlite:sqlite-framework"))
api(project(":sqlite:sqlite"))
- implementation(ARCH_CORE_RUNTIME)
+ implementation(project(":arch:core-runtime"))
implementation(ANDROIDX_CORE)
implementation(ANDROIDX_COLLECTION)
compileOnly(ARCH_PAGING_COMMON)
diff --git a/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java b/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java
index 3bea10e..bb893fd 100644
--- a/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java
+++ b/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java
@@ -116,7 +116,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public DatabaseConfiguration(@NonNull Context context, @Nullable String name,
@NonNull SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory,
@NonNull RoomDatabase.MigrationContainer migrationContainer,
diff --git a/room/runtime/src/main/java/androidx/room/EntityDeletionOrUpdateAdapter.java b/room/runtime/src/main/java/androidx/room/EntityDeletionOrUpdateAdapter.java
index 098a14b..ec3122d 100644
--- a/room/runtime/src/main/java/androidx/room/EntityDeletionOrUpdateAdapter.java
+++ b/room/runtime/src/main/java/androidx/room/EntityDeletionOrUpdateAdapter.java
@@ -27,7 +27,7 @@
* @param <T> The type parameter of the entity to be deleted
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@SuppressWarnings({"WeakerAccess", "unused"})
public abstract class EntityDeletionOrUpdateAdapter<T> extends SharedSQLiteStatement {
/**
diff --git a/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java b/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
index 97f3969..bf5776d 100644
--- a/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
+++ b/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
@@ -32,7 +32,7 @@
* @hide
*/
@SuppressWarnings({"WeakerAccess", "unused"})
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class EntityInsertionAdapter<T> extends SharedSQLiteStatement {
/**
* Creates an InsertionAdapter that can insert the entity type T into the given database.
diff --git a/room/runtime/src/main/java/androidx/room/InvalidationTracker.java b/room/runtime/src/main/java/androidx/room/InvalidationTracker.java
index 8874e1e..25def49 100644
--- a/room/runtime/src/main/java/androidx/room/InvalidationTracker.java
+++ b/room/runtime/src/main/java/androidx/room/InvalidationTracker.java
@@ -16,7 +16,6 @@
package androidx.room;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
@@ -116,7 +115,6 @@
// should be accessed with synchronization only.
@VisibleForTesting
- @SuppressLint("RestrictedApi")
final SafeIterableMap<Observer, ObserverWrapper> mObserverMap = new SafeIterableMap<>();
private MultiInstanceInvalidationClient mMultiInstanceInvalidationClient;
@@ -127,7 +125,7 @@
* @hide
*/
@SuppressWarnings("WeakerAccess")
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public InvalidationTracker(RoomDatabase database, String... tableNames) {
this(database, new HashMap<String, String>(), Collections.<String, Set<String>>emptyMap(),
tableNames);
@@ -139,7 +137,7 @@
* @hide
*/
@SuppressWarnings("WeakerAccess")
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public InvalidationTracker(RoomDatabase database, Map<String, String> shadowTablesMap,
Map<String, Set<String>> viewTables, String... tableNames) {
mDatabase = database;
@@ -259,7 +257,6 @@
*
* @param observer The observer which listens the database for changes.
*/
- @SuppressLint("RestrictedApi")
@WorkerThread
public void addObserver(@NonNull Observer observer) {
final String[] tableNames = resolveViews(observer.mTables);
@@ -322,7 +319,7 @@
* @hide
*/
@SuppressWarnings("unused")
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public void addWeakObserver(Observer observer) {
addObserver(new WeakObserver(this, observer));
}
@@ -332,7 +329,6 @@
*
* @param observer The observer to remove.
*/
- @SuppressLint("RestrictedApi")
@SuppressWarnings("WeakerAccess")
@WorkerThread
public void removeObserver(@NonNull final Observer observer) {
@@ -458,7 +454,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@WorkerThread
public void refreshVersionsSync() {
syncTriggers();
@@ -561,7 +557,7 @@
* invalidates.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public <T> LiveData<T> createLiveData(String[] tableNames, Callable<T> computeFunction) {
return mInvalidationLiveDataContainer.create(
validateAndResolveTableNames(tableNames), computeFunction);
diff --git a/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationService.java b/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationService.java
index 833a43f..2c7a67a 100644
--- a/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationService.java
+++ b/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationService.java
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class MultiInstanceInvalidationService extends Service {
// synthetic access
diff --git a/room/runtime/src/main/java/androidx/room/RoomDatabase.java b/room/runtime/src/main/java/androidx/room/RoomDatabase.java
index 1c7c68a..3f55b7e 100644
--- a/room/runtime/src/main/java/androidx/room/RoomDatabase.java
+++ b/room/runtime/src/main/java/androidx/room/RoomDatabase.java
@@ -68,7 +68,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static final int MAX_BIND_PARAMETER_CNT = 999;
/**
* Set by the generated open helper.
@@ -218,7 +218,7 @@
* @hide
*/
@SuppressWarnings("WeakerAccess")
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
// used in generated code
public void assertNotMainThread() {
if (mAllowMainThreadQueries) {
@@ -687,7 +687,6 @@
* @return A new database instance.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public T build() {
//noinspection ConstantConditions
if (mContext == null) {
diff --git a/room/runtime/src/main/java/androidx/room/RoomOpenHelper.java b/room/runtime/src/main/java/androidx/room/RoomOpenHelper.java
index b792693..7a9affba 100644
--- a/room/runtime/src/main/java/androidx/room/RoomOpenHelper.java
+++ b/room/runtime/src/main/java/androidx/room/RoomOpenHelper.java
@@ -34,7 +34,7 @@
* @hide
*/
@SuppressWarnings("unused")
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class RoomOpenHelper extends SupportSQLiteOpenHelper.Callback {
@Nullable
private DatabaseConfiguration mConfiguration;
@@ -165,7 +165,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract static class Delegate {
public final int version;
diff --git a/room/runtime/src/main/java/androidx/room/RoomSQLiteQuery.java b/room/runtime/src/main/java/androidx/room/RoomSQLiteQuery.java
index 08db4a4..689352c 100644
--- a/room/runtime/src/main/java/androidx/room/RoomSQLiteQuery.java
+++ b/room/runtime/src/main/java/androidx/room/RoomSQLiteQuery.java
@@ -38,7 +38,7 @@
* @hide
*/
@SuppressWarnings("unused")
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class RoomSQLiteQuery implements SupportSQLiteQuery, SupportSQLiteProgram {
@SuppressWarnings("WeakerAccess")
@VisibleForTesting
diff --git a/room/runtime/src/main/java/androidx/room/RoomTrackingLiveData.java b/room/runtime/src/main/java/androidx/room/RoomTrackingLiveData.java
index 6074d7d..5274cae 100644
--- a/room/runtime/src/main/java/androidx/room/RoomTrackingLiveData.java
+++ b/room/runtime/src/main/java/androidx/room/RoomTrackingLiveData.java
@@ -16,7 +16,6 @@
package androidx.room;
-import android.annotation.SuppressLint;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
@@ -120,7 +119,6 @@
}
}
};
- @SuppressLint("RestrictedApi")
RoomTrackingLiveData(
RoomDatabase database,
InvalidationLiveDataContainer container,
diff --git a/room/runtime/src/main/java/androidx/room/SharedSQLiteStatement.java b/room/runtime/src/main/java/androidx/room/SharedSQLiteStatement.java
index 57d3340..20c06c8 100644
--- a/room/runtime/src/main/java/androidx/room/SharedSQLiteStatement.java
+++ b/room/runtime/src/main/java/androidx/room/SharedSQLiteStatement.java
@@ -32,7 +32,7 @@
* @hide
*/
@SuppressWarnings({"WeakerAccess", "unused"})
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class SharedSQLiteStatement {
private final AtomicBoolean mLock = new AtomicBoolean(false);
diff --git a/room/runtime/src/main/java/androidx/room/paging/LimitOffsetDataSource.java b/room/runtime/src/main/java/androidx/room/paging/LimitOffsetDataSource.java
index 282389c..e137e5f 100644
--- a/room/runtime/src/main/java/androidx/room/paging/LimitOffsetDataSource.java
+++ b/room/runtime/src/main/java/androidx/room/paging/LimitOffsetDataSource.java
@@ -44,7 +44,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class LimitOffsetDataSource<T> extends PositionalDataSource<T> {
private final RoomSQLiteQuery mSourceQuery;
private final String mCountQuery;
diff --git a/room/runtime/src/main/java/androidx/room/util/CursorUtil.java b/room/runtime/src/main/java/androidx/room/util/CursorUtil.java
index 53ef36c..05b8c59 100644
--- a/room/runtime/src/main/java/androidx/room/util/CursorUtil.java
+++ b/room/runtime/src/main/java/androidx/room/util/CursorUtil.java
@@ -27,7 +27,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class CursorUtil {
/**
diff --git a/room/runtime/src/main/java/androidx/room/util/DBUtil.java b/room/runtime/src/main/java/androidx/room/util/DBUtil.java
index dd0363e..0cdc494 100644
--- a/room/runtime/src/main/java/androidx/room/util/DBUtil.java
+++ b/room/runtime/src/main/java/androidx/room/util/DBUtil.java
@@ -34,7 +34,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class DBUtil {
/**
diff --git a/room/runtime/src/main/java/androidx/room/util/FtsTableInfo.java b/room/runtime/src/main/java/androidx/room/util/FtsTableInfo.java
index 0b59ed2..c076a02 100644
--- a/room/runtime/src/main/java/androidx/room/util/FtsTableInfo.java
+++ b/room/runtime/src/main/java/androidx/room/util/FtsTableInfo.java
@@ -33,7 +33,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class FtsTableInfo {
// A set of valid FTS Options
diff --git a/room/runtime/src/main/java/androidx/room/util/StringUtil.java b/room/runtime/src/main/java/androidx/room/util/StringUtil.java
index b865138..2b30eb6 100644
--- a/room/runtime/src/main/java/androidx/room/util/StringUtil.java
+++ b/room/runtime/src/main/java/androidx/room/util/StringUtil.java
@@ -30,7 +30,7 @@
*
* String utilities for Room
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class StringUtil {
@SuppressWarnings("unused")
diff --git a/room/runtime/src/main/java/androidx/room/util/TableInfo.java b/room/runtime/src/main/java/androidx/room/util/TableInfo.java
index 819c726..c187334 100644
--- a/room/runtime/src/main/java/androidx/room/util/TableInfo.java
+++ b/room/runtime/src/main/java/androidx/room/util/TableInfo.java
@@ -46,7 +46,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@SuppressWarnings({"WeakerAccess", "unused", "TryFinallyCanBeTryWithResources",
"SimplifiableIfStatement"})
// if you change this class, you must change TableInfoWriter.kt
@@ -438,7 +438,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static class ForeignKey {
@NonNull
public final String referenceTable;
@@ -504,7 +504,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
static class ForeignKeyWithSequence implements Comparable<ForeignKeyWithSequence> {
final int mId;
final int mSequence;
@@ -534,7 +534,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static class Index {
// should match the value in Index.kt
public static final String DEFAULT_PREFIX = "index_";
diff --git a/room/runtime/src/main/java/androidx/room/util/ViewInfo.java b/room/runtime/src/main/java/androidx/room/util/ViewInfo.java
index 918f8da..5e4b9b2 100644
--- a/room/runtime/src/main/java/androidx/room/util/ViewInfo.java
+++ b/room/runtime/src/main/java/androidx/room/util/ViewInfo.java
@@ -30,7 +30,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ViewInfo {
/**
diff --git a/room/rxjava2/src/main/java/androidx/room/RxRoom.java b/room/rxjava2/src/main/java/androidx/room/RxRoom.java
index 2cb32d9..1e78572 100644
--- a/room/rxjava2/src/main/java/androidx/room/RxRoom.java
+++ b/room/rxjava2/src/main/java/androidx/room/RxRoom.java
@@ -99,7 +99,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static <T> Flowable<T> createFlowable(final RoomDatabase database,
final String[] tableNames, final Callable<T> callable) {
Scheduler scheduler = Schedulers.from(database.getQueryExecutor());
@@ -163,7 +163,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static <T> Observable<T> createObservable(final RoomDatabase database,
final String[] tableNames, final Callable<T> callable) {
Scheduler scheduler = Schedulers.from(database.getQueryExecutor());
diff --git a/room/testing/build.gradle b/room/testing/build.gradle
index f7aa608..01116c9 100644
--- a/room/testing/build.gradle
+++ b/room/testing/build.gradle
@@ -29,7 +29,7 @@
api(project(":sqlite:sqlite"))
api(project(":sqlite:sqlite-framework"))
api(project(":room:room-migration"))
- implementation(ARCH_CORE_RUNTIME)
+ implementation(project(":arch:core-runtime"))
api(SUPPORT_CORE_UTILS, libs.support_exclude_config)
api(JUNIT)
}
diff --git a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
index 9cc827c..b0ea740 100644
--- a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
+++ b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
@@ -16,7 +16,6 @@
package androidx.room.testing;
-import android.annotation.SuppressLint;
import android.app.Instrumentation;
import android.content.Context;
import android.database.Cursor;
@@ -136,7 +135,6 @@
* @throws IOException If it cannot find the schema description in the assets folder.
*/
@SuppressWarnings("SameParameterValue")
- @SuppressLint("RestrictedApi")
public SupportSQLiteDatabase createDatabase(String name, int version) throws IOException {
File dbPath = mInstrumentation.getTargetContext().getDatabasePath(name);
if (dbPath.exists()) {
@@ -194,7 +192,6 @@
* @throws IOException If it cannot find the schema for {@code toVersion}.
* @throws IllegalStateException If the schema validation fails.
*/
- @SuppressLint("RestrictedApi")
public SupportSQLiteDatabase runMigrationsAndValidate(String name, int version,
boolean validateDroppedTables, Migration... migrations) throws IOException {
File dbPath = mInstrumentation.getTargetContext().getDatabasePath(name);
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
index 203c09b..37d3f0e 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
@@ -16,6 +16,7 @@
package com.example.android.supportv7.widget;
+import android.graphics.Rect;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -39,6 +40,7 @@
private ViewGroup mContainer;
private CheckBox mIsModal;
+ private CheckBox mUseEpicenter;
private TextView mLog;
@@ -60,6 +62,7 @@
mContainer = findViewById(R.id.container);
mIsModal = (CheckBox) mContainer.findViewById(R.id.is_modal);
+ mUseEpicenter = (CheckBox) mContainer.findViewById(R.id.use_custom_epicenter);
mLog = (TextView) mContainer.findViewById(R.id.log);
mButton = (Button) mContainer.findViewById(R.id.test_button);
@@ -113,6 +116,11 @@
mListPopupWindow.setAdapter(mListPopupAdapter);
mListPopupWindow.setAnchorView(mButton);
+ final int hOffset = getResources().getDisplayMetrics().heightPixels / 3;
+ final Rect epicenter = mUseEpicenter.isChecked()
+ ? new Rect(0, hOffset, 0, hOffset) : null;
+ mListPopupWindow.setEpicenterBounds(epicenter);
+
// Register a listener to be notified when an item in our popup window has
// been clicked.
mListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
diff --git a/samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml b/samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml
index 34da5bb..5167c8f 100644
--- a/samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml
+++ b/samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml
@@ -32,10 +32,24 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentLeft="true"
android:text="@string/list_popup_window_is_modal"
+ android:paddingEnd="@dimen/control_offset_medium"
+ android:paddingRight="@dimen/control_offset_medium"
android:checked="true" />
+ <CheckBox
+ android:id="@+id/use_custom_epicenter"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:text="@string/list_popup_window_use_epicenter"
+ android:layout_toRightOf="@id/is_modal"
+ android:layout_toEndOf="@id/is_modal"
+ android:checked="false" />
+
<TextView
android:id="@+id/log"
android:layout_width="match_parent"
diff --git a/samples/Support7Demos/src/main/res/values/dimens.xml b/samples/Support7Demos/src/main/res/values/dimens.xml
index f2520b9..9bb0502 100644
--- a/samples/Support7Demos/src/main/res/values/dimens.xml
+++ b/samples/Support7Demos/src/main/res/values/dimens.xml
@@ -18,5 +18,6 @@
<dimen name="color_palette_size">60dp</dimen>
<dimen name="touch_item_min_height">60dp</dimen>
+ <dimen name="control_offset_medium">10dip</dimen>
</resources>
diff --git a/samples/Support7Demos/src/main/res/values/strings.xml b/samples/Support7Demos/src/main/res/values/strings.xml
index 90c8de6..e1bbe81 100644
--- a/samples/Support7Demos/src/main/res/values/strings.xml
+++ b/samples/Support7Demos/src/main/res/values/strings.xml
@@ -224,9 +224,10 @@
<string name="mode_night_alertdialog_title">AppCompat/DayNight/AlertDialog Usage</string>
<string name="list_popup_window_activity">AppCompat/List popup window</string>
- <string name="list_popup_window_summary">This activity illustrates the use of list popup windows. The popup window is shown by clicking the button above. The checkbox controls the modality. The text area below logs various events - it should log a tap on itself when a non-modal popup window is dismissed by tapping on the log area.</string>
+ <string name="list_popup_window_summary">This activity illustrates the use of list popup windows. The popup window is shown by clicking the button above. The checkboxes controls the modality and transition epicenter bounds. The text area below logs various events - it should log a tap on itself when a non-modal popup window is dismissed by tapping on the log area.</string>
<string name="list_popup_window_button">Show popup!</string>
- <string name="list_popup_window_is_modal">is modal</string>
+ <string name="list_popup_window_is_modal">Is modal</string>
+ <string name="list_popup_window_use_epicenter">Custom Epicenter</string>
<string name="popup_menu_activity">AppCompat/Popup menu</string>
<string name="popup_menu_summary">This activity illustrates the use of popup menus. The popup menu is shown by clicking the button above. The text area below logs various events.</string>
diff --git a/samples/SupportCarDemos/src/main/AndroidManifest.xml b/samples/SupportCarDemos/src/main/AndroidManifest.xml
index 2ecca36..a994028 100644
--- a/samples/SupportCarDemos/src/main/AndroidManifest.xml
+++ b/samples/SupportCarDemos/src/main/AndroidManifest.xml
@@ -142,6 +142,17 @@
android:value=".SupportCarDemoActivity" />
</activity>
+ <activity android:name=".SwitchListItemActivity"
+ android:label="SwitchListItem"
+ android:parentActivityName=".SupportCarDemoActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.SAMPLE_CODE" />
+ </intent-filter>
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value=".SupportCarDemoActivity" />
+ </activity>
+
<activity android:name=".CarAlertDialogDemo"
android:label="CarAlertDialogDemo"
android:parentActivityName=".SupportCarDemoActivity">
@@ -185,6 +196,18 @@
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value=".SupportCarDemoActivity" />
</activity>
+
+ <activity android:name=".TabLayoutDemoActivity"
+ android:label="TabLayoutDemo"
+ android:parentActivityName=".SupportCarDemoActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.SAMPLE_CODE" />
+ </intent-filter>
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value=".SupportCarDemoActivity" />
+ </activity>
+
<activity
android:name=".SpinnerActivity"
android:label="Spinner"
@@ -199,6 +222,7 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".SupportCarDemoActivity"/>
</activity>
+
<activity
android:name=".TextInputDemoActivity"
android:label="Text Input Demo"
@@ -213,6 +237,7 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".SupportCarDemoActivity"/>
</activity>
+
<activity
android:name=".GridLayoutTopBottomOffsetActivity"
android:label="Grid Layout Top/Bottom Offset Demo"
@@ -227,6 +252,7 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".SupportCarDemoActivity"/>
</activity>
+
<activity android:name=".MixedColumnPagedListViewActivity"
android:label="Mixed Column Paged List View"
android:parentActivityName=".SupportCarDemoActivity">
diff --git a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/CarToolbarActivity.java b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/CarToolbarActivity.java
index 6bfef1c..7f99c46 100644
--- a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/CarToolbarActivity.java
+++ b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/CarToolbarActivity.java
@@ -83,6 +83,8 @@
items.add(new CarMenuItem.Builder()
.setTitle("If-Room item")
.setDisplayBehavior(CarMenuItem.DisplayBehavior.IF_ROOM)
+ .setIcon(Icon.createWithResource(this,
+ android.R.drawable.sym_def_app_icon))
.setOnClickListener(onClickListener)
.build());
carToolbar.setMenuItems(items);
diff --git a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SwitchListItemActivity.java b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SwitchListItemActivity.java
new file mode 100644
index 0000000..7b9a95a
--- /dev/null
+++ b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/SwitchListItemActivity.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.car;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.widget.CompoundButton;
+import android.widget.Toast;
+
+import androidx.car.widget.CarToolbar;
+import androidx.car.widget.ListItem;
+import androidx.car.widget.ListItemAdapter;
+import androidx.car.widget.ListItemProvider;
+import androidx.car.widget.PagedListView;
+import androidx.car.widget.SwitchListItem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Demo activity for {@link androidx.car.widget.SwitchListItem}.
+ */
+public class SwitchListItemActivity extends Activity {
+
+ private PagedListView mPagedListView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_paged_list_view);
+
+ CarToolbar toolbar = findViewById(R.id.car_toolbar);
+ toolbar.setTitle(R.string.switch_list_item_title);
+ toolbar.setNavigationIconOnClickListener(v -> finish());
+
+ mPagedListView = findViewById(R.id.paged_list_view);
+
+ SampleProvider provider = new SampleProvider(this);
+ ListItemAdapter adapter = new ListItemAdapter(this, provider);
+
+ mPagedListView.setAdapter(adapter);
+ mPagedListView.setMaxPages(PagedListView.UNLIMITED_PAGES);
+
+ SwitchListItem item = new SwitchListItem(this);
+ item.setTitle("Clicking me to set checked state of item above");
+ item.setSwitchOnCheckedChangeListener((buttonView, isChecked) -> {
+ int size = adapter.getItemCount();
+ // -2 to get second to last item (the one above).
+ ((SwitchListItem) provider.mItems.get(size - 2)).setSwitchState(isChecked);
+ adapter.notifyDataSetChanged();
+ });
+ provider.mItems.add(item);
+ }
+
+ private static class SampleProvider extends ListItemProvider {
+ private Context mContext;
+
+ private final List<ListItem> mItems = new ArrayList<>();
+ private final ListItemProvider.ListProvider mListProvider =
+ new ListItemProvider.ListProvider(mItems);
+ private final CompoundButton.OnCheckedChangeListener mListener = (button, isChecked) ->
+ Toast.makeText(mContext,
+ "Switch is " + (isChecked ? "checked" : "unchecked"),
+ Toast.LENGTH_SHORT).show();
+
+ SampleProvider(Context context) {
+ mContext = context;
+
+ String longText = mContext.getString(R.string.long_text);
+
+ SwitchListItem item;
+
+ item = new SwitchListItem(mContext);
+ item.setTitle("Title - show divider");
+ item.setShowSwitchDivider(true);
+ item.setSwitchOnCheckedChangeListener(mListener);
+ mItems.add(item);
+
+ item = new SwitchListItem(mContext);
+ item.setBody("Body text");
+ item.setSwitchOnCheckedChangeListener(mListener);
+ mItems.add(item);
+
+ item = new SwitchListItem(mContext);
+ item.setTitle("Long body text");
+ item.setBody(longText);
+ item.setSwitchOnCheckedChangeListener(mListener);
+ mItems.add(item);
+
+ item = new SwitchListItem(mContext);
+ item.setTitle("Clicking item toggles switch");
+ item.setClickable(true);
+ item.setSwitchOnCheckedChangeListener(mListener);
+ mItems.add(item);
+
+ item = new SwitchListItem(mContext);
+ item.setTitle("Disabled item");
+ item.setEnabled(false);
+ item.setSwitchOnCheckedChangeListener(mListener);
+ mItems.add(item);
+ }
+
+ @Override
+ public ListItem get(int position) {
+ return mListProvider.get(position);
+ }
+
+ @Override
+ public int size() {
+ return mListProvider.size();
+ }
+ }
+}
+
diff --git a/samples/SupportCarDemos/src/main/java/com/example/androidx/car/TabLayoutDemoActivity.java b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/TabLayoutDemoActivity.java
new file mode 100644
index 0000000..353f183
--- /dev/null
+++ b/samples/SupportCarDemos/src/main/java/com/example/androidx/car/TabLayoutDemoActivity.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.androidx.car;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.google.android.material.tabs.TabLayout;
+
+/**
+ * Demo activity for themes and custom views on a {@link TabLayout}.
+ */
+public class TabLayoutDemoActivity extends AppCompatActivity {
+ private TabLayout mTabLayout;
+
+ private boolean mShowText = true;
+ private boolean mShowIcon = true;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.tab_bar_view_activity);
+
+ mTabLayout = findViewById(R.id.tab_layout);
+
+ findViewById(R.id.tab_align_start).setOnClickListener(
+ v -> mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE));
+
+ findViewById(R.id.tab_align_center).setOnClickListener(
+ v -> mTabLayout.setTabMode(TabLayout.MODE_FIXED));
+
+ findViewById(R.id.add_tab).setOnClickListener(v -> addTab());
+ findViewById(R.id.remove_tab).setOnClickListener(v -> removeTab());
+
+ findViewById(R.id.tab_text_and_icon).setOnClickListener(v -> {
+ mShowText = true;
+ mShowIcon = true;
+ refreshTabs();
+ });
+
+ findViewById(R.id.tab_text_only).setOnClickListener(v -> {
+ mShowText = true;
+ mShowIcon = false;
+ refreshTabs();
+ });
+
+ findViewById(R.id.tab_icon_only).setOnClickListener(v -> {
+ mShowText = false;
+ mShowIcon = true;
+ refreshTabs();
+ });
+ }
+
+ private void addTab() {
+ int tabCount = mTabLayout.getTabCount();
+
+ TabLayout.Tab tab = mTabLayout.newTab()
+ .setCustomView(R.layout.car_tab_view);
+
+ if (mShowIcon) {
+ tab.setIcon(R.drawable.ic_home);
+ }
+
+ if (mShowText) {
+ tab.setText("Tab " + tabCount);
+ }
+
+ mTabLayout.addTab(tab);
+ }
+
+ private void removeTab() {
+ int tabCount = mTabLayout.getTabCount();
+
+ if (tabCount > 0) {
+ mTabLayout.removeTabAt(tabCount - 1);
+ }
+ }
+
+ private void refreshTabs() {
+ int tabCount = mTabLayout.getTabCount();
+ mTabLayout.removeAllTabs();
+
+ for (int i = 0; i < tabCount; i++) {
+ addTab();
+ }
+ }
+}
diff --git a/samples/SupportCarDemos/src/main/res/drawable/ic_home.xml b/samples/SupportCarDemos/src/main/res/drawable/ic_home.xml
new file mode 100644
index 0000000..74a04f7
--- /dev/null
+++ b/samples/SupportCarDemos/src/main/res/drawable/ic_home.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M20,40V28h8v12h10V24h6L24,6 4,24h6v16z"
+ android:fillColor="#000000"/>
+</vector>
diff --git a/samples/SupportCarDemos/src/main/res/layout/tab_bar_view_activity.xml b/samples/SupportCarDemos/src/main/res/layout/tab_bar_view_activity.xml
new file mode 100644
index 0000000..c6cb3c3
--- /dev/null
+++ b/samples/SupportCarDemos/src/main/res/layout/tab_bar_view_activity.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, softwareb
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:background="@android:color/black"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <com.google.android.material.tabs.TabLayout
+ android:id="@+id/tab_layout"
+ android:background="@android:color/black"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/car_app_bar_height"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent" >
+
+ <com.google.android.material.tabs.TabItem
+ android:icon="@drawable/ic_home"
+ android:text="Tab 0"
+ android:layout="@layout/car_tab_view" />
+ <com.google.android.material.tabs.TabItem
+ android:icon="@drawable/ic_home"
+ android:text="Tab 1"
+ android:layout="@layout/car_tab_view" />
+ <com.google.android.material.tabs.TabItem
+ android:icon="@drawable/ic_home"
+ android:text="Tab 2"
+ android:layout="@layout/car_tab_view" />
+ <com.google.android.material.tabs.TabItem
+ android:icon="@drawable/ic_home"
+ android:text="Tab 3"
+ android:layout="@layout/car_tab_view" />
+ </com.google.android.material.tabs.TabLayout>
+
+ <Button
+ android:id="@+id/tab_align_start"
+ android:text="@string/button_tab_align_start"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/tab_align_center"
+ app:layout_constraintHorizontal_chainStyle="packed" />
+ <Button
+ android:id="@+id/tab_align_center"
+ android:text="@string/button_tab_align_center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@+id/tab_align_start"
+ app:layout_constraintEnd_toStartOf="@+id/add_tab" />
+ <Button
+ android:id="@+id/add_tab"
+ android:text="@string/button_add_tab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@+id/tab_align_center"
+ app:layout_constraintEnd_toStartOf="@+id/remove_tab" />
+ <Button
+ android:id="@+id/remove_tab"
+ android:text="@string/button_remove_tab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@+id/add_tab"
+ app:layout_constraintEnd_toEndOf="parent" />
+
+ <androidx.constraintlayout.widget.Guideline
+ android:id="@+id/guideline"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.7" />
+
+ <Button
+ android:id="@+id/tab_text_and_icon"
+ android:text="@string/button_tab_text_and_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="@+id/guideline"
+ app:layout_constraintBottom_toBottomOf="@+id/guideline"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/tab_text_only"
+ app:layout_constraintHorizontal_chainStyle="packed" />
+ <Button
+ android:id="@+id/tab_text_only"
+ android:text="@string/button_tab_text_only"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="@+id/guideline"
+ app:layout_constraintBottom_toBottomOf="@+id/guideline"
+ app:layout_constraintStart_toEndOf="@+id/tab_text_and_icon"
+ app:layout_constraintEnd_toStartOf="@+id/tab_icon_only" />
+ <Button
+ android:id="@+id/tab_icon_only"
+ android:text="@string/button_tab_icon_only"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_padding_4"
+ app:layout_constraintTop_toTopOf="@+id/guideline"
+ app:layout_constraintBottom_toBottomOf="@+id/guideline"
+ app:layout_constraintStart_toEndOf="@+id/tab_text_only"
+ app:layout_constraintEnd_toEndOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/samples/SupportCarDemos/src/main/res/values/strings.xml b/samples/SupportCarDemos/src/main/res/values/strings.xml
index 3383aaf8..c2ab6f1 100644
--- a/samples/SupportCarDemos/src/main/res/values/strings.xml
+++ b/samples/SupportCarDemos/src/main/res/values/strings.xml
@@ -22,6 +22,7 @@
<string name="paged_list_view_shrink_title">PagedListViewShrinkDemo</string>
<string name="text_list_item_title">TextListItem</string>
<string name="seekbar_list_item_title">SeekbarListItem</string>
+ <string name="switch_list_item_title">SwitchListItem</string>
<string name="sub_header_list_item_title">SubheaderListItem</string>
<string name="alpha_jump_title">Alpha Jump Demo</string>
@@ -149,5 +150,14 @@
<string name="show_nothing">Show nothing</string>
<string name="show_buttons">Only show buttons</string>
<string name="show_everything">Show everything</string>
+
+ <!-- Strings for TabBarViewActivity Demo. -->
+ <string name="button_tab_align_start">Align start</string>
+ <string name="button_tab_align_center">Align center</string>
+ <string name="button_add_tab">Add tab</string>
+ <string name="button_remove_tab">Remove tab</string>
+ <string name="button_tab_text_and_icon">Text + Icon</string>
+ <string name="button_tab_text_only">Text only</string>
+ <string name="button_tab_icon_only">Icon only</string>
</resources>
diff --git a/samples/SupportPreferenceDemos/src/main/res/values/strings.xml b/samples/SupportPreferenceDemos/src/main/res/values/strings.xml
index de19c77..7fbc88e 100644
--- a/samples/SupportPreferenceDemos/src/main/res/values/strings.xml
+++ b/samples/SupportPreferenceDemos/src/main/res/values/strings.xml
@@ -51,7 +51,6 @@
<string name="title_dropdown_preference">Dropdown preference</string>
<string name="title_seekbar_preference">Seekbar preference</string>
- <string name="summary_seekbar_preference">This seekbar has a default value of 5 and a max value of 10</string>
<!--This section is for preferences that launch a dialog to edit the preference -->
<string name="dialogs">Dialogs</string>
diff --git a/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml b/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
index 0a5676b..11e9737 100644
--- a/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
+++ b/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
@@ -70,7 +70,6 @@
<SeekBarPreference
android:key="seekbar"
android:title="@string/title_seekbar_preference"
- android:summary="@string/summary_seekbar_preference"
android:max="10"
android:defaultValue="5"/>
</PreferenceCategory>
diff --git a/savedstate/api/1.0.0-alpha01.txt b/savedstate/api/1.0.0-alpha01.txt
new file mode 100644
index 0000000..e509849
--- /dev/null
+++ b/savedstate/api/1.0.0-alpha01.txt
@@ -0,0 +1,27 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class SavedStateRegistry {
+ method @MainThread public android.os.Bundle? consumeRestoredStateForKey(String);
+ method @MainThread public boolean isRestored();
+ method @MainThread public void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
+ method @MainThread public void unregisterSavedStateProvider(String);
+ }
+
+ public static interface SavedStateRegistry.SavedStateProvider {
+ method public android.os.Bundle saveState();
+ }
+
+ public final class SavedStateRegistryController {
+ ctor public SavedStateRegistryController();
+ method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+ method @MainThread public void performRestore(android.os.Bundle?);
+ method @MainThread public void performSave(android.os.Bundle);
+ }
+
+ public interface SavedStateRegistryOwner {
+ method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+ }
+
+}
+
diff --git a/savedstate/api/current.txt b/savedstate/api/current.txt
new file mode 100644
index 0000000..e509849
--- /dev/null
+++ b/savedstate/api/current.txt
@@ -0,0 +1,27 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class SavedStateRegistry {
+ method @MainThread public android.os.Bundle? consumeRestoredStateForKey(String);
+ method @MainThread public boolean isRestored();
+ method @MainThread public void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
+ method @MainThread public void unregisterSavedStateProvider(String);
+ }
+
+ public static interface SavedStateRegistry.SavedStateProvider {
+ method public android.os.Bundle saveState();
+ }
+
+ public final class SavedStateRegistryController {
+ ctor public SavedStateRegistryController();
+ method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+ method @MainThread public void performRestore(android.os.Bundle?);
+ method @MainThread public void performSave(android.os.Bundle);
+ }
+
+ public interface SavedStateRegistryOwner {
+ method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/savedstate/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from savedstate/bundle/api/res-1.0.0-alpha01.txt
rename to savedstate/api/res-1.0.0-alpha01.txt
diff --git a/savedstate/bundle/build.gradle b/savedstate/build.gradle
similarity index 94%
rename from savedstate/bundle/build.gradle
rename to savedstate/build.gradle
index 6963997..9b64665 100644
--- a/savedstate/bundle/build.gradle
+++ b/savedstate/build.gradle
@@ -15,7 +15,7 @@
dependencies {
api("androidx.annotation:annotation:1.0.0")
- api(project(":savedstate:savedstate-common"))
+ implementation(ARCH_CORE_COMMON)
androidTestImplementation(KOTLIN_STDLIB)
androidTestImplementation(TEST_EXT_JUNIT)
diff --git a/savedstate/bundle/api/1.0.0-alpha01.txt b/savedstate/bundle/api/1.0.0-alpha01.txt
deleted file mode 100644
index 401346d6..0000000
--- a/savedstate/bundle/api/1.0.0-alpha01.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-// Signature format: 3.0
-package androidx.savedstate.bundle {
-
- public final class BundleSavedStateRegistry extends androidx.savedstate.AbstractSavedStateRegistry<android.os.Bundle> {
- ctor public BundleSavedStateRegistry();
- method @MainThread public void performRestore(android.os.Bundle?);
- method @MainThread public void performSave(android.os.Bundle);
- }
-
- public interface BundleSavedStateRegistryOwner {
- method public androidx.savedstate.SavedStateRegistry<android.os.Bundle> getBundleSavedStateRegistry();
- }
-
-}
-
diff --git a/savedstate/bundle/api/current.txt b/savedstate/bundle/api/current.txt
deleted file mode 100644
index 401346d6..0000000
--- a/savedstate/bundle/api/current.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-// Signature format: 3.0
-package androidx.savedstate.bundle {
-
- public final class BundleSavedStateRegistry extends androidx.savedstate.AbstractSavedStateRegistry<android.os.Bundle> {
- ctor public BundleSavedStateRegistry();
- method @MainThread public void performRestore(android.os.Bundle?);
- method @MainThread public void performSave(android.os.Bundle);
- }
-
- public interface BundleSavedStateRegistryOwner {
- method public androidx.savedstate.SavedStateRegistry<android.os.Bundle> getBundleSavedStateRegistry();
- }
-
-}
-
diff --git a/savedstate/bundle/src/androidTest/java/androidx/savedstate/bundle/BundlableSavedStateRegistryTest.kt b/savedstate/bundle/src/androidTest/java/androidx/savedstate/bundle/BundlableSavedStateRegistryTest.kt
deleted file mode 100644
index 3b0b903..0000000
--- a/savedstate/bundle/src/androidTest/java/androidx/savedstate/bundle/BundlableSavedStateRegistryTest.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.savedstate.bundle
-
-import android.os.Bundle
-import androidx.test.filters.SmallTest
-import org.hamcrest.CoreMatchers.`is`
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@SmallTest
-@RunWith(JUnit4::class)
-class BundlableSavedStateRegistryTest {
-
- @Test
- fun saveRestoreFlow() {
- val registry = BundleSavedStateRegistry()
- registry.registerSavedStateProvider("a") { bundleOf("foo", 1) }
- registry.registerSavedStateProvider("b") { bundleOf("foo", 2) }
- val state = Bundle()
- registry.performSave(state)
-
- val newRegistry = BundleSavedStateRegistry()
- newRegistry.performRestore(state)
-
- assertThat(newRegistry.isRestored, `is`(true))
- val bundleForA = newRegistry.consumeRestoredStateForKey("a")
- val bundleForB = newRegistry.consumeRestoredStateForKey("b")
-
- assertThat(bundleForA.isSame(bundleOf("foo", 1)), `is`(true))
- assertThat(bundleForB.isSame(bundleOf("foo", 2)), `is`(true))
- }
-}
-
-private fun bundleOf(key: String, value: Int): Bundle {
- val result = Bundle()
- result.putInt(key, value)
- return result
-}
-
-private fun Bundle?.isSame(other: Bundle): Boolean {
- if (this == null) {
- return false
- }
- if (keySet() != other.keySet()) {
- return false
- }
- for (key in keySet()) {
- if (get(key) != other.get(key)) {
- return false
- }
- }
- return true
-}
\ No newline at end of file
diff --git a/savedstate/bundle/src/main/java/androidx/savedstate/bundle/BundleSavedStateRegistry.java b/savedstate/bundle/src/main/java/androidx/savedstate/bundle/BundleSavedStateRegistry.java
deleted file mode 100644
index 0c1d1e2..0000000
--- a/savedstate/bundle/src/main/java/androidx/savedstate/bundle/BundleSavedStateRegistry.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.savedstate.bundle;
-
-import android.os.Bundle;
-
-import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.savedstate.AbstractSavedStateRegistry;
-import androidx.savedstate.SavedStateRegistry;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A default implementation of {@link SavedStateRegistry} backed by {@link Bundle}.
- * <p>
- * An owner of this {@link BundleSavedStateRegistry} must call {@link #performRestore(Bundle)}
- * once previously saved state becomes available to it.
- * <p>
- * To collect saved state supplied by {@link SavedStateRegistry.SavedStateProvider}
- * an owner should call {@link #performSave(Bundle)}
- */
-public final class BundleSavedStateRegistry extends AbstractSavedStateRegistry<Bundle> {
- private static final String SAVED_COMPONENTS_KEY =
- "androidx.lifecycle.BundlableSavedStateRegistry.key";
-
- /**
- * An interface for an owner of this @{code {@link SavedStateRegistry} to restore saved state.
- *
- * @param savedState restored state
- */
- @SuppressWarnings("WeakerAccess")
- @MainThread
- public void performRestore(@Nullable Bundle savedState) {
- Bundle componentsState = savedState != null ? savedState.getBundle(SAVED_COMPONENTS_KEY)
- : null;
- if (componentsState == null || componentsState.isEmpty()) {
- restoreSavedState(null);
- return;
- }
- Map<String, Bundle> initialState = new HashMap<>();
- for (String key : componentsState.keySet()) {
- initialState.put(key, componentsState.getBundle(key));
- }
- restoreSavedState(initialState);
- }
-
- /**
- * An interface for an owner of this @{code {@link SavedStateRegistry}
- * to perform state saving, it will call all registered providers and
- * merge with unconsumed state.
- *
- * @param outBundle Bundle in which to place a saved state
- */
- @MainThread
- public void performSave(@NonNull Bundle outBundle) {
- Map<String, Bundle> bundleMap = saveState();
- Bundle components = new Bundle();
- for (Map.Entry<String, Bundle> entry : bundleMap.entrySet()) {
- components.putBundle(entry.getKey(), entry.getValue());
- }
- outBundle.putBundle(SAVED_COMPONENTS_KEY, components);
- }
-}
diff --git a/savedstate/common/api/1.0.0-alpha01.txt b/savedstate/common/api/1.0.0-alpha01.txt
deleted file mode 100644
index 32c9395..0000000
--- a/savedstate/common/api/1.0.0-alpha01.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Signature format: 3.0
-package androidx.savedstate {
-
- public abstract class AbstractSavedStateRegistry<S> implements androidx.savedstate.SavedStateRegistry<S> {
- ctor public AbstractSavedStateRegistry();
- method @MainThread public final S? consumeRestoredStateForKey(String);
- method @MainThread public final boolean isRestored();
- method @MainThread public final void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider<S>);
- method @MainThread protected final void restoreSavedState(java.util.Map<java.lang.String,S>?);
- method @MainThread protected final java.util.Map<java.lang.String,S> saveState();
- method @MainThread public final void unregisterSavedStateProvider(String);
- }
-
- public interface SavedStateRegistry<S> {
- method @MainThread public S? consumeRestoredStateForKey(String);
- method @MainThread public boolean isRestored();
- method @MainThread public void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider<S>);
- method @MainThread public void unregisterSavedStateProvider(String);
- }
-
- public static interface SavedStateRegistry.SavedStateProvider<S> {
- method public S saveState();
- }
-
-}
-
diff --git a/savedstate/common/api/current.txt b/savedstate/common/api/current.txt
deleted file mode 100644
index 32c9395..0000000
--- a/savedstate/common/api/current.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Signature format: 3.0
-package androidx.savedstate {
-
- public abstract class AbstractSavedStateRegistry<S> implements androidx.savedstate.SavedStateRegistry<S> {
- ctor public AbstractSavedStateRegistry();
- method @MainThread public final S? consumeRestoredStateForKey(String);
- method @MainThread public final boolean isRestored();
- method @MainThread public final void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider<S>);
- method @MainThread protected final void restoreSavedState(java.util.Map<java.lang.String,S>?);
- method @MainThread protected final java.util.Map<java.lang.String,S> saveState();
- method @MainThread public final void unregisterSavedStateProvider(String);
- }
-
- public interface SavedStateRegistry<S> {
- method @MainThread public S? consumeRestoredStateForKey(String);
- method @MainThread public boolean isRestored();
- method @MainThread public void registerSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider<S>);
- method @MainThread public void unregisterSavedStateProvider(String);
- }
-
- public static interface SavedStateRegistry.SavedStateProvider<S> {
- method public S saveState();
- }
-
-}
-
diff --git a/savedstate/common/build.gradle b/savedstate/common/build.gradle
deleted file mode 100644
index 5cf97a3..0000000
--- a/savedstate/common/build.gradle
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.SupportLibraryExtension
-
-plugins {
- id("SupportJavaLibraryPlugin")
- id("kotlin")
-}
-
-dependencies {
- api(SUPPORT_ANNOTATIONS)
- implementation(ARCH_CORE_COMMON)
-
- testImplementation(JUNIT)
- testImplementation(TEST_EXT_JUNIT)
- testImplementation(TEST_CORE)
- testImplementation(TEST_RUNNER)
- testImplementation(KOTLIN_STDLIB)
-}
-
-supportLibrary {
- name = "Android Lifecycle Saved State"
- publish = true
- mavenVersion = LibraryVersions.SAVEDSTATE
- mavenGroup = LibraryGroups.SAVEDSTATE
- inceptionYear = "2018"
- description = "Android Lifecycle Saved State"
- url = SupportLibraryExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
diff --git a/savedstate/common/src/main/AndroidManifest.xml b/savedstate/common/src/main/AndroidManifest.xml
deleted file mode 100644
index bbc896a..0000000
--- a/savedstate/common/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
- ~ 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="androidx.lifecycle.savedstate.common">
-</manifest>
diff --git a/savedstate/common/src/main/java/androidx/savedstate/AbstractSavedStateRegistry.java b/savedstate/common/src/main/java/androidx/savedstate/AbstractSavedStateRegistry.java
deleted file mode 100644
index a1081de..0000000
--- a/savedstate/common/src/main/java/androidx/savedstate/AbstractSavedStateRegistry.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.savedstate;
-
-import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.arch.core.internal.SafeIterableMap;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * This class provides a skeletal implementation of the {@link SavedStateRegistry}.
- * <p>
- * Implementations simply need to call {@link #restoreSavedState(Map)} to initialize restored state
- * and call {@link #saveState()} once system requests saved state.
- *
- * @param <S> represents a class for saving a state, typically it is {@link android.os.Bundle}
- *
- * @see androidx.activity.BundleSavedStateRegistry
- */
-public abstract class AbstractSavedStateRegistry<S> implements SavedStateRegistry<S> {
- private SafeIterableMap<String, SavedStateProvider<S>> mComponents =
- new SafeIterableMap<>();
- private Map<String, S> mSavedState;
- private boolean mRestored;
-
- @MainThread
- @Nullable
- @Override
- public final S consumeRestoredStateForKey(@NonNull String key) {
- if (!mRestored) {
- throw new IllegalStateException("You can consumeRestoredStateForKey "
- + "only after super.onCreate of corresponding component");
- }
- S state = null;
- if (mSavedState != null) {
- state = mSavedState.remove(key);
- if (mSavedState.isEmpty()) {
- mSavedState = null;
- }
- }
- return state;
- }
-
- @MainThread
- @Override
- public final void registerSavedStateProvider(@NonNull String key,
- @NonNull SavedStateProvider<S> provider) {
- SavedStateProvider<S> previous = mComponents.putIfAbsent(key, provider);
- if (previous != null) {
- throw new IllegalArgumentException("SavedStateProvider with the given key is"
- + " already registered");
- }
- }
-
- /**
- * Unregisters a component previously registered by the given {@code key}
- *
- * @param key a key with which a component was previously registered.
- */
- @MainThread
- @Override
- public final void unregisterSavedStateProvider(@NonNull String key) {
- mComponents.remove(key);
- }
-
- /**
- * Returns if state was restored after creation and can be safely consumed
- * with {@link #consumeRestoredStateForKey(String)}
- *
- * @return true if state was restored.
- */
- @MainThread
- @Override
- public final boolean isRestored() {
- return mRestored;
- }
-
- /**
- * Subclasses of this {@code AbstractSavedStateRegistry} should call this
- * method to initialize restored state.
- */
- @SuppressWarnings("WeakerAccess")
- @MainThread
- protected final void restoreSavedState(@Nullable Map<String, S> initialState) {
- if (initialState != null) {
- mSavedState = new HashMap<>(initialState);
- }
- mRestored = true;
- }
-
- /**
- * Subclasses of this {@code AbstractSavedStateRegistry} should call this
- * method to perform state saving, this method will call all registered providers and
- * merge a state provided by them with all unconsumed values since previous restoration.
- *
- * @return state that should be saved.
- */
- @MainThread
- @NonNull
- protected final Map<String, S> saveState() {
- Map<String, S> savedState = new HashMap<>();
- if (mSavedState != null) {
- savedState.putAll(mSavedState);
- }
- for (Iterator<Map.Entry<String, SavedStateProvider<S>>> it =
- mComponents.iteratorWithAdditions(); it.hasNext(); ) {
- Map.Entry<String, SavedStateProvider<S>> entry = it.next();
- savedState.put(entry.getKey(), entry.getValue().saveState());
- }
- return savedState;
- }
-}
diff --git a/savedstate/common/src/main/java/androidx/savedstate/SavedStateRegistry.java b/savedstate/common/src/main/java/androidx/savedstate/SavedStateRegistry.java
deleted file mode 100644
index a0b069e..0000000
--- a/savedstate/common/src/main/java/androidx/savedstate/SavedStateRegistry.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.savedstate;
-
-import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/**
- * An interface for plugging components that consumes and contributes to the saved state.
- *
- * @param <S> represents a class for saving a state, typically it is {@link android.os.Bundle}
- */
-public interface SavedStateRegistry<S> {
- /**
- * Consumes saved state previously supplied by {@link SavedStateProvider} registered
- * via {@link #registerSavedStateProvider(String, SavedStateProvider)}
- * with the given {@code key}.
- * <p>
- * This call clears an internal reference to returned saved state, so if you call it second time
- * in the row it will return {@code null}.
- * <p>
- * All unconsumed values will be saved during {@code onSaveInstanceState(Bundle savedState)}
- * <p>
- * This method can be called after {@code super.onCreate(savedStateBundle)} of the corresponding
- * component. Calling it before that will result in {@code IllegalArgumentException}.
- * {@link Lifecycle.Event#ON_CREATE} can be used as a signal
- * that a saved state can be safely consumed.
- *
- * @param key a key with which {@link SavedStateProvider} was previously registered.
- * @return {@code S} with the previously saved state or {@code null}
- */
- @MainThread
- @Nullable
- S consumeRestoredStateForKey(@NonNull String key);
-
- /**
- * Returns if a state was restored and can be safely consumed
- * with {@link #consumeRestoredStateForKey(String)}
- *
- * @return true if state was restored.
- */
- @MainThread
- boolean isRestored();
-
- /**
- * This interface marks a component that contributes to saved state.
- *
- * @param <S> represents a class for saving a state, typically it is {@link android.os.Bundle}
- */
- interface SavedStateProvider<S> {
- /**
- * Called to retrieve a state from a component before being killed
- * so later the state can be received from {@link #consumeRestoredStateForKey(String)}
- *
- * @return S with your saved state.
- */
- @NonNull
- S saveState();
- }
-
- /**
- * Registers a {@link SavedStateProvider} by the given {@code key}. This
- * {@code savedStateProvider} will be called
- * during state saving phase, returned object will be associated with the given {@code key}
- * and can be used after the restoration via {@link #consumeRestoredStateForKey(String)}.
- * <p>
- * If there is unconsumed value with the same {@code key},
- * the value supplied by {@code savedStateProvider} will be override and
- * will be written to resulting saved state.
- * <p> if a provider was already registered with the given {@code key}, an implementation should
- * throw an {@link IllegalArgumentException}
- * @param key a key with which returned saved state will be associated
- * @param savedStateProvider savedStateProvider to get saved state.
- */
- @MainThread
- void registerSavedStateProvider(@NonNull String key,
- @NonNull SavedStateProvider<S> savedStateProvider);
-
- /**
- * Unregisters a component previously registered by the given {@code key}
- *
- * @param key a key with which a component was previously registered.
- */
- @MainThread
- void unregisterSavedStateProvider(@NonNull String key);
-}
diff --git a/savedstate/common/src/test/java/androidx/savedstate/AbstractSavedStateRegistryTest.kt b/savedstate/common/src/test/java/androidx/savedstate/AbstractSavedStateRegistryTest.kt
deleted file mode 100644
index e2e86e5..0000000
--- a/savedstate/common/src/test/java/androidx/savedstate/AbstractSavedStateRegistryTest.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.savedstate
-
-import org.hamcrest.CoreMatchers.`is`
-import org.hamcrest.CoreMatchers.nullValue
-import org.hamcrest.MatcherAssert.assertThat
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class AbstractSavedStateRegistryTest {
-
- @Test
- fun registerWithSameKey() {
- val registry = TestSavedStateRegistry()
- registry.registerSavedStateProvider("key") { "a" }
- try {
- registry.registerSavedStateProvider("key") { "b" }
- Assert.fail("can't register with the same key")
- } catch (e: IllegalArgumentException) {
- // fail as expected
- }
- }
-
- @Test
- fun saveRestoreFlow() {
- val registry = TestSavedStateRegistry()
- registry.registerSavedStateProvider("a") { "bla" }
- registry.registerSavedStateProvider("b") { "boo" }
- val savedState = registry.savedState()
-
- val newRegistry = TestSavedStateRegistry()
- newRegistry.restoreState(savedState)
-
- assertThat(newRegistry.isRestored, `is`(true))
- assertThat(newRegistry.consumeRestoredStateForKey("a"), `is`("bla"))
- assertThat(newRegistry.consumeRestoredStateForKey("b"), `is`("boo"))
- }
-
- @Test
- fun consumeSameTwice() {
- val registry = TestSavedStateRegistry()
- registry.registerSavedStateProvider("a") { "foo" }
- val state = registry.savedState()
-
- val newStore = TestSavedStateRegistry()
- newStore.restoreState(state)
-
- assertThat(newStore.isRestored, `is`(true))
- assertThat(newStore.consumeRestoredStateForKey("a"), `is`("foo"))
- assertThat(newStore.consumeRestoredStateForKey("a"), nullValue())
- }
-
- @Test
- fun unregister() {
- val registry = TestSavedStateRegistry()
- registry.registerSavedStateProvider("a") { "foo" }
- registry.unregisterSavedStateProvider("a")
- // this call should succeed
- registry.registerSavedStateProvider("a") { "foo" }
- registry.unregisterSavedStateProvider("a")
-
- assertThat(registry.savedState().isEmpty(), `is`(true))
- }
-
- @Test
- fun unconsumedSavedState() {
- val registry = TestSavedStateRegistry()
- registry.registerSavedStateProvider("a") { "foo" }
- val savedState1 = registry.savedState()
- val intermediateStore = TestSavedStateRegistry()
- intermediateStore.restoreState(savedState1)
- val savedState2 = intermediateStore.savedState()
- val newRegistry = TestSavedStateRegistry()
- newRegistry.restoreState(savedState2)
- assertThat(newRegistry.consumeRestoredStateForKey("a"), `is`("foo"))
- }
-
- @Test
- fun unconsumedSavedStateClashWithCallback() {
- val registry = TestSavedStateRegistry()
- registry.registerSavedStateProvider("a") { "foo" }
- val savedState1 = registry.savedState()
- val intermediateStore = TestSavedStateRegistry()
- intermediateStore.restoreState(savedState1)
- // there is unconsumed value for "a"
- intermediateStore.registerSavedStateProvider("a") { "bar" }
- val savedState2 = intermediateStore.savedState()
- val newStore = TestSavedStateRegistry()
- newStore.restoreState(savedState2)
- assertThat(newStore.consumeRestoredStateForKey("a"), `is`("bar"))
- }
-
- class TestSavedStateRegistry : AbstractSavedStateRegistry<String>() {
- fun restoreState(state: Map<String, String>) {
- restoreSavedState(state)
- }
- fun savedState() = saveState()
- }
-}
diff --git a/savedstate/bundle/src/androidTest/AndroidManifest.xml b/savedstate/src/androidTest/AndroidManifest.xml
similarity index 94%
rename from savedstate/bundle/src/androidTest/AndroidManifest.xml
rename to savedstate/src/androidTest/AndroidManifest.xml
index c28734c..e9a46d7 100644
--- a/savedstate/bundle/src/androidTest/AndroidManifest.xml
+++ b/savedstate/src/androidTest/AndroidManifest.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="androidx.savedstate.bundle">
+ package="androidx.savedstate.test">
<uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
<application>
diff --git a/savedstate/src/androidTest/java/androidx/savedstate/SavedStateRegistryTest.kt b/savedstate/src/androidTest/java/androidx/savedstate/SavedStateRegistryTest.kt
new file mode 100644
index 0000000..d79b464
--- /dev/null
+++ b/savedstate/src/androidTest/java/androidx/savedstate/SavedStateRegistryTest.kt
@@ -0,0 +1,160 @@
+/*
+ * 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.savedstate
+
+import android.os.Bundle
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class SavedStateRegistryTest {
+
+ @Test
+ fun saveRestoreFlow() {
+ val registry = SavedStateRegistry()
+ registry.registerSavedStateProvider("a") { bundleOf("foo", 1) }
+ registry.registerSavedStateProvider("b") { bundleOf("foo", 2) }
+ val state = Bundle()
+ registry.performSave(state)
+
+ val newRegistry = SavedStateRegistry()
+ newRegistry.performRestore(state)
+
+ assertThat(newRegistry.isRestored).isTrue()
+ val bundleForA = newRegistry.consumeRestoredStateForKey("a")
+ val bundleForB = newRegistry.consumeRestoredStateForKey("b")
+ assertThat(bundleForA.isSame(bundleOf("foo", 1))).isTrue()
+ assertThat(bundleForA.isSame(bundleOf("foo", 1))).isTrue()
+ assertThat(bundleForB.isSame(bundleOf("foo", 2))).isTrue()
+ }
+
+ @Test
+ fun registerWithSameKey() {
+ val registry = SavedStateRegistry()
+ registry.registerSavedStateProvider("key") { bundleOf("foo", "a") }
+ try {
+ registry.registerSavedStateProvider("key") { bundleOf("foo", "b") }
+ Assert.fail("can't register with the same key")
+ } catch (e: IllegalArgumentException) {
+ // fail as expected
+ }
+ }
+
+ @Test
+ fun consumeSameTwice() {
+ val registry = SavedStateRegistry()
+ registry.registerSavedStateProvider("a") { bundleOf("key", "fo") }
+
+ val state = Bundle()
+ registry.performSave(state)
+
+ val newStore = SavedStateRegistry()
+ newStore.performRestore(state)
+
+ assertThat(newStore.isRestored).isTrue()
+ assertThat(newStore.consumeRestoredStateForKey("a").isSame(bundleOf("key", "fo"))).isTrue()
+ assertThat(newStore.consumeRestoredStateForKey("a")).isNull()
+ }
+
+ @Test
+ fun unregister() {
+ val registry = SavedStateRegistry()
+ registry.registerSavedStateProvider("a") { bundleOf("key", "fo") }
+ registry.unregisterSavedStateProvider("a")
+ // this call should succeed
+ registry.registerSavedStateProvider("a") { bundleOf("key", "fo") }
+ registry.unregisterSavedStateProvider("a")
+ val state = Bundle()
+ registry.performSave(state)
+
+ val newStore = SavedStateRegistry()
+ newStore.performRestore(state)
+ assertThat(newStore.consumeRestoredStateForKey("a")).isNull()
+ }
+
+ @Test
+ fun unconsumedSavedState() {
+ val registry = SavedStateRegistry()
+ registry.registerSavedStateProvider("a") { bundleOf("key", "fo") }
+ val savedState1 = Bundle()
+ registry.performSave(savedState1)
+
+ val intermediateStore = SavedStateRegistry()
+ intermediateStore.performRestore(savedState1)
+
+ val savedState2 = Bundle()
+ intermediateStore.performSave(savedState2)
+
+ val newRegistry = SavedStateRegistry()
+ newRegistry.performRestore(savedState2)
+ assertThat(
+ newRegistry.consumeRestoredStateForKey("a")
+ .isSame(bundleOf("key", "fo"))
+ ).isTrue()
+ }
+
+ @Test
+ fun unconsumedSavedStateClashWithCallback() {
+ val registry = SavedStateRegistry()
+ registry.registerSavedStateProvider("a") { bundleOf("key", "fo") }
+ val savedState1 = Bundle()
+ registry.performSave(savedState1)
+
+ val intermediateStore = SavedStateRegistry()
+ intermediateStore.performRestore(savedState1)
+ // there is unconsumed value for "a"
+ intermediateStore.registerSavedStateProvider("a") { bundleOf("key", "ba") }
+ val savedState2 = Bundle()
+ intermediateStore.performSave(savedState2)
+
+ val newStore = SavedStateRegistry()
+ newStore.performRestore(savedState2)
+ assertThat(newStore.consumeRestoredStateForKey("a").isSame(bundleOf("key", "ba"))).isTrue()
+ }
+}
+
+private fun bundleOf(key: String, value: Int): Bundle {
+ val result = Bundle()
+ result.putInt(key, value)
+ return result
+}
+
+private fun bundleOf(key: String, value: String): Bundle {
+ val result = Bundle()
+ result.putString(key, value)
+ return result
+}
+
+private fun Bundle?.isSame(other: Bundle): Boolean {
+ if (this == null) {
+ return false
+ }
+ if (keySet() != other.keySet()) {
+ return false
+ }
+ for (key in keySet()) {
+ if (get(key) != other.get(key)) {
+ return false
+ }
+ }
+ return true
+}
\ No newline at end of file
diff --git a/savedstate/bundle/src/main/AndroidManifest.xml b/savedstate/src/main/AndroidManifest.xml
similarity index 93%
rename from savedstate/bundle/src/main/AndroidManifest.xml
rename to savedstate/src/main/AndroidManifest.xml
index f52ae56..db70f2e 100644
--- a/savedstate/bundle/src/main/AndroidManifest.xml
+++ b/savedstate/src/main/AndroidManifest.xml
@@ -13,5 +13,5 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest package="androidx.savedstate.bundle">
+<manifest package="androidx.savedstate">
</manifest>
diff --git a/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java b/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java
new file mode 100644
index 0000000..5c3548e
--- /dev/null
+++ b/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.savedstate;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.arch.core.internal.SafeIterableMap;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * An interface for plugging components that consumes and contributes to the saved state.
+ */
+@SuppressLint("RestrictedApi")
+public final class SavedStateRegistry {
+ private static final String SAVED_COMPONENTS_KEY =
+ "androidx.lifecycle.BundlableSavedStateRegistry.key";
+
+ private SafeIterableMap<String, SavedStateProvider> mComponents =
+ new SafeIterableMap<>();
+ @Nullable
+ private Bundle mRestoredState;
+ private boolean mRestored;
+
+ SavedStateRegistry() {
+ }
+
+ /**
+ * Consumes saved state previously supplied by {@link SavedStateProvider} registered
+ * via {@link #registerSavedStateProvider(String, SavedStateProvider)}
+ * with the given {@code key}.
+ * <p>
+ * This call clears an internal reference to returned saved state, so if you call it second time
+ * in the row it will return {@code null}.
+ * <p>
+ * All unconsumed values will be saved during {@code onSaveInstanceState(Bundle savedState)}
+ * <p>
+ * This method can be called after {@code super.onCreate(savedStateBundle)} of the corresponding
+ * component. Calling it before that will result in {@code IllegalArgumentException}.
+ * {@link Lifecycle.Event#ON_CREATE} can be used as a signal
+ * that a saved state can be safely consumed.
+ *
+ * @param key a key with which {@link SavedStateProvider} was previously registered.
+ * @return {@code S} with the previously saved state or {@code null}
+ */
+ @MainThread
+ @Nullable
+ public Bundle consumeRestoredStateForKey(@NonNull String key) {
+ if (!mRestored) {
+ throw new IllegalStateException("You can consumeRestoredStateForKey "
+ + "only after super.onCreate of corresponding component");
+ }
+ if (mRestoredState != null) {
+ Bundle result = mRestoredState.getBundle(key);
+ mRestoredState.remove(key);
+ if (mRestoredState.isEmpty()) {
+ mRestoredState = null;
+ }
+ return result;
+ }
+ return null;
+ }
+
+ /**
+ * Registers a {@link SavedStateProvider} by the given {@code key}. This
+ * {@code savedStateProvider} will be called
+ * during state saving phase, returned object will be associated with the given {@code key}
+ * and can be used after the restoration via {@link #consumeRestoredStateForKey(String)}.
+ * <p>
+ * If there is unconsumed value with the same {@code key},
+ * the value supplied by {@code savedStateProvider} will be override and
+ * will be written to resulting saved state.
+ * <p> if a provider was already registered with the given {@code key}, an implementation should
+ * throw an {@link IllegalArgumentException}
+ *
+ * @param key a key with which returned saved state will be associated
+ * @param provider savedStateProvider to get saved state.
+ */
+ @MainThread
+ public void registerSavedStateProvider(@NonNull String key,
+ @NonNull SavedStateProvider provider) {
+ SavedStateProvider previous = mComponents.putIfAbsent(key, provider);
+ if (previous != null) {
+ throw new IllegalArgumentException("SavedStateProvider with the given key is"
+ + " already registered");
+ }
+ }
+
+ /**
+ * Unregisters a component previously registered by the given {@code key}
+ *
+ * @param key a key with which a component was previously registered.
+ */
+ @MainThread
+ public void unregisterSavedStateProvider(@NonNull String key) {
+ mComponents.remove(key);
+ }
+
+ /**
+ * Returns if state was restored after creation and can be safely consumed
+ * with {@link #consumeRestoredStateForKey(String)}
+ *
+ * @return true if state was restored.
+ */
+ @MainThread
+ public boolean isRestored() {
+ return mRestored;
+ }
+
+ /**
+ * An interface for an owner of this @{code {@link SavedStateRegistry} to restore saved state.
+ *
+ * @param savedState restored state
+ */
+ @SuppressWarnings("WeakerAccess")
+ @MainThread
+ void performRestore(@Nullable Bundle savedState) {
+ if (mRestored) {
+ throw new IllegalStateException("SavedStateRegistry was already restored.");
+ }
+ if (savedState != null) {
+ mRestoredState = savedState.getBundle(SAVED_COMPONENTS_KEY);
+ }
+ mRestored = true;
+ }
+
+ /**
+ * An interface for an owner of this @{code {@link SavedStateRegistry}
+ * to perform state saving, it will call all registered providers and
+ * merge with unconsumed state.
+ *
+ * @param outBundle Bundle in which to place a saved state
+ */
+ @MainThread
+ void performSave(@NonNull Bundle outBundle) {
+ Bundle components = new Bundle();
+ if (mRestoredState != null) {
+ components.putAll(mRestoredState);
+ }
+ for (Iterator<Map.Entry<String, SavedStateProvider>> it =
+ mComponents.iteratorWithAdditions(); it.hasNext(); ) {
+ Map.Entry<String, SavedStateProvider> entry1 = it.next();
+ components.putBundle(entry1.getKey(), entry1.getValue().saveState());
+ }
+ outBundle.putBundle(SAVED_COMPONENTS_KEY, components);
+ }
+
+ /**
+ * This interface marks a component that contributes to saved state.
+ */
+ public interface SavedStateProvider {
+ /**
+ * Called to retrieve a state from a component before being killed
+ * so later the state can be received from {@link #consumeRestoredStateForKey(String)}
+ *
+ * @return S with your saved state.
+ */
+ @NonNull
+ Bundle saveState();
+ }
+}
diff --git a/savedstate/src/main/java/androidx/savedstate/SavedStateRegistryController.java b/savedstate/src/main/java/androidx/savedstate/SavedStateRegistryController.java
new file mode 100644
index 0000000..eab93fd
--- /dev/null
+++ b/savedstate/src/main/java/androidx/savedstate/SavedStateRegistryController.java
@@ -0,0 +1,64 @@
+/*
+ * 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.savedstate;
+
+import android.os.Bundle;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * An API for {@link SavedStateRegistryOwner} implementations to control {@link SavedStateRegistry}.
+ * <p>
+ * {@code SavedStateRegistryOwner} should call {@link #performRestore(Bundle)} to restore state of
+ * {@link SavedStateRegistry} and {@link #performSave(Bundle)} to gather SavedState from it.
+ */
+public final class SavedStateRegistryController {
+ private SavedStateRegistry mRegistry = new SavedStateRegistry();
+
+ /**
+ * Returns controlled {@link SavedStateRegistry}
+ */
+ @NonNull
+ public SavedStateRegistry getSavedStateRegistry() {
+ return mRegistry;
+ }
+
+ /**
+ * An interface for an owner of this @{code {@link SavedStateRegistry} to restore saved state.
+ *
+ * @param savedState restored state
+ */
+ @SuppressWarnings("WeakerAccess")
+ @MainThread
+ public void performRestore(@Nullable Bundle savedState) {
+ mRegistry.performRestore(savedState);
+ }
+
+ /**
+ * An interface for an owner of this @{code {@link SavedStateRegistry}
+ * to perform state saving, it will call all registered providers and
+ * merge with unconsumed state.
+ *
+ * @param outBundle Bundle in which to place a saved state
+ */
+ @MainThread
+ public void performSave(@NonNull Bundle outBundle) {
+ mRegistry.performSave(outBundle);
+ }
+}
diff --git a/savedstate/bundle/src/main/java/androidx/savedstate/bundle/BundleSavedStateRegistryOwner.java b/savedstate/src/main/java/androidx/savedstate/SavedStateRegistryOwner.java
similarity index 74%
rename from savedstate/bundle/src/main/java/androidx/savedstate/bundle/BundleSavedStateRegistryOwner.java
rename to savedstate/src/main/java/androidx/savedstate/SavedStateRegistryOwner.java
index 5b6abdf..08d4551 100644
--- a/savedstate/bundle/src/main/java/androidx/savedstate/bundle/BundleSavedStateRegistryOwner.java
+++ b/savedstate/src/main/java/androidx/savedstate/SavedStateRegistryOwner.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2018 The Android Open Source Project
+ * Copyright 2019 The Android Open 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,23 +14,20 @@
* limitations under the License.
*/
-package androidx.savedstate.bundle;
+package androidx.savedstate;
-import android.os.Bundle;
-
import androidx.annotation.NonNull;
-import androidx.savedstate.SavedStateRegistry;
/**
* A scope that owns {@link SavedStateRegistry}
*/
-public interface BundleSavedStateRegistryOwner {
+public interface SavedStateRegistryOwner {
/**
* Returns owned {@link SavedStateRegistry}
*
* @return a {@link SavedStateRegistry}
*/
@NonNull
- SavedStateRegistry<Bundle> getBundleSavedStateRegistry();
+ SavedStateRegistry getSavedStateRegistry();
}
diff --git a/security/crypto/OWNERS b/security/crypto/OWNERS
new file mode 100644
index 0000000..f856cfb
--- /dev/null
+++ b/security/crypto/OWNERS
@@ -0,0 +1 @@
+jmarkoff@google.com
\ No newline at end of file
diff --git a/security/crypto/api/1.0.0-alpha01.txt b/security/crypto/api/1.0.0-alpha01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/security/crypto/api/1.0.0-alpha01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/security/crypto/api/current.txt b/security/crypto/api/current.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/security/crypto/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/security/crypto/api/res-1.0.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to security/crypto/api/res-1.0.0-alpha01.txt
diff --git a/security/crypto/build.gradle b/security/crypto/build.gradle
new file mode 100644
index 0000000..03e11af
--- /dev/null
+++ b/security/crypto/build.gradle
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+
+plugins {
+ id("SupportAndroidLibraryPlugin")
+ id("kotlin-android")
+}
+
+dependencies {}
+
+android {
+ defaultConfig {
+ minSdkVersion 23
+ }
+}
+
+supportLibrary {
+ name = "AndroidX Security"
+ publish = false
+ mavenVersion = LibraryVersions.SECURITY
+ mavenGroup = LibraryGroups.SECURITY
+ inceptionYear = "2019"
+ description = "AndroidX Security"
+}
diff --git a/security/crypto/src/androidTest/AndroidManifest.xml b/security/crypto/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..7affe51
--- /dev/null
+++ b/security/crypto/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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.security.tests">
+ <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+</manifest>
diff --git a/savedstate/bundle/src/main/AndroidManifest.xml b/security/crypto/src/main/AndroidManifest.xml
similarity index 84%
copy from savedstate/bundle/src/main/AndroidManifest.xml
copy to security/crypto/src/main/AndroidManifest.xml
index f52ae56..e85a787 100644
--- a/savedstate/bundle/src/main/AndroidManifest.xml
+++ b/security/crypto/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Android Open Source Project
+<!-- Copyright 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,5 +13,5 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest package="androidx.savedstate.bundle">
-</manifest>
+
+<manifest package="androidx.security"/>
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 07744b5..fbd60d7 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -155,8 +155,8 @@
includeProject(":remotecallback", "remotecallback")
includeProject(":versionedparcelable-annotation", "versionedparcelable/annotation")
includeProject(":versionedparcelable", "versionedparcelable")
-includeProject(":savedstate:savedstate-common", "savedstate/common")
-includeProject(":savedstate:savedstate-bundle", "savedstate/bundle")
+includeProject(":savedstate", "savedstate")
+includeProject(":security:security-crypto", "security/crypto")
includeProject(":sharetarget", "sharetarget")
includeProject(":sharetarget:integration-tests:testapp", "sharetarget/integration-tests/testapp")
includeProject(":slice-core", "slices/core")
diff --git a/sharetarget/src/main/java/androidx/sharetarget/ChooserTargetServiceCompat.java b/sharetarget/src/main/java/androidx/sharetarget/ChooserTargetServiceCompat.java
index 08c7504..f713377 100644
--- a/sharetarget/src/main/java/androidx/sharetarget/ChooserTargetServiceCompat.java
+++ b/sharetarget/src/main/java/androidx/sharetarget/ChooserTargetServiceCompat.java
@@ -16,7 +16,7 @@
package androidx.sharetarget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ComponentName;
import android.content.Context;
@@ -44,7 +44,7 @@
* @hide
*/
@RequiresApi(23)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ChooserTargetServiceCompat extends ChooserTargetService {
static final String TAG = "ChooserServiceCompat";
diff --git a/sharetarget/src/main/java/androidx/sharetarget/ShareTargetCompat.java b/sharetarget/src/main/java/androidx/sharetarget/ShareTargetCompat.java
index cc6b347..09b6262 100644
--- a/sharetarget/src/main/java/androidx/sharetarget/ShareTargetCompat.java
+++ b/sharetarget/src/main/java/androidx/sharetarget/ShareTargetCompat.java
@@ -16,7 +16,7 @@
package androidx.sharetarget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -25,7 +25,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class ShareTargetCompat {
static class TargetData {
final String mScheme;
diff --git a/sharetarget/src/main/java/androidx/sharetarget/ShareTargetXmlParser.java b/sharetarget/src/main/java/androidx/sharetarget/ShareTargetXmlParser.java
index 3a7584d..b87fad1 100644
--- a/sharetarget/src/main/java/androidx/sharetarget/ShareTargetXmlParser.java
+++ b/sharetarget/src/main/java/androidx/sharetarget/ShareTargetXmlParser.java
@@ -16,7 +16,7 @@
package androidx.sharetarget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.content.res.Resources;
@@ -35,7 +35,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
class ShareTargetXmlParser {
static final String TAG = "ShareTargetXmlParser";
diff --git a/sharetarget/src/main/java/androidx/sharetarget/ShortcutInfoCompatSaverImpl.java b/sharetarget/src/main/java/androidx/sharetarget/ShortcutInfoCompatSaverImpl.java
index fcff477..c0ef1dc 100644
--- a/sharetarget/src/main/java/androidx/sharetarget/ShortcutInfoCompatSaverImpl.java
+++ b/sharetarget/src/main/java/androidx/sharetarget/ShortcutInfoCompatSaverImpl.java
@@ -16,7 +16,7 @@
package androidx.sharetarget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Bitmap;
@@ -60,7 +60,7 @@
* @hide
*/
@RequiresApi(19)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
//TODO: we need Futures.addCallback and CallbackToFutureAdapter, update once they're available
public class ShortcutInfoCompatSaverImpl extends ShortcutInfoCompatSaver {
diff --git a/slices/builders/ktx/api/1.0.0-alpha07.txt b/slices/builders/ktx/api/1.0.0-alpha07.txt
new file mode 100644
index 0000000..d1c4426
--- /dev/null
+++ b/slices/builders/ktx/api/1.0.0-alpha07.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.slice.builders {
+
+ public final class CellBuilderDsl extends androidx.slice.builders.GridRowBuilder.CellBuilder {
+ ctor public CellBuilderDsl();
+ }
+
+ public final class GridRowBuilderDsl extends androidx.slice.builders.GridRowBuilder {
+ ctor public GridRowBuilderDsl();
+ }
+
+ public final class GridRowBuilderKt {
+ ctor public GridRowBuilderKt();
+ method public static inline androidx.slice.builders.GridRowBuilder cell(androidx.slice.builders.GridRowBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.CellBuilderDsl,kotlin.Unit> buildCell);
+ method public static inline androidx.slice.builders.GridRowBuilder seeMoreCell(androidx.slice.builders.GridRowBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.CellBuilderDsl,kotlin.Unit> buildCell);
+ }
+
+ public final class HeaderBuilderDsl extends androidx.slice.builders.ListBuilder.HeaderBuilder {
+ ctor public HeaderBuilderDsl();
+ }
+
+ public final class InputRangeBuilderDsl extends androidx.slice.builders.ListBuilder.InputRangeBuilder {
+ ctor public InputRangeBuilderDsl();
+ }
+
+ public final class ListBuilderDsl extends androidx.slice.builders.ListBuilder {
+ ctor public ListBuilderDsl(android.content.Context context, android.net.Uri uri, long ttl);
+ }
+
+ public final class ListBuilderKt {
+ ctor public ListBuilderKt();
+ method public static inline androidx.slice.builders.ListBuilder gridRow(androidx.slice.builders.ListBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.GridRowBuilderDsl,kotlin.Unit> buildGrid);
+ method public static inline androidx.slice.builders.ListBuilder header(androidx.slice.builders.ListBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.HeaderBuilderDsl,kotlin.Unit> buildHeader);
+ method public static inline androidx.slice.builders.ListBuilder inputRange(androidx.slice.builders.ListBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.InputRangeBuilderDsl,kotlin.Unit> buildInputRange);
+ method public static inline androidx.slice.Slice list(android.content.Context context, android.net.Uri uri, long ttl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.ListBuilderDsl,kotlin.Unit> addRows);
+ method public static inline androidx.slice.builders.ListBuilder range(androidx.slice.builders.ListBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.RangeBuilderDsl,kotlin.Unit> buildRange);
+ method public static inline androidx.slice.builders.ListBuilder row(androidx.slice.builders.ListBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.RowBuilderDsl,kotlin.Unit> buildRow);
+ method public static inline androidx.slice.builders.ListBuilder seeMoreRow(androidx.slice.builders.ListBuilderDsl, kotlin.jvm.functions.Function1<? super androidx.slice.builders.RowBuilderDsl,kotlin.Unit> buildRow);
+ method public static androidx.slice.builders.SliceAction tapSliceAction(android.app.PendingIntent pendingIntent, androidx.core.graphics.drawable.IconCompat icon, @androidx.slice.builders.ListBuilder.ImageMode int imageMode = 0, CharSequence title);
+ method public static androidx.slice.builders.SliceAction toggleSliceAction(android.app.PendingIntent pendingIntent, androidx.core.graphics.drawable.IconCompat? icon = null, CharSequence title, boolean isChecked);
+ }
+
+ public final class RangeBuilderDsl extends androidx.slice.builders.ListBuilder.RangeBuilder {
+ ctor public RangeBuilderDsl();
+ }
+
+ public final class RowBuilderDsl extends androidx.slice.builders.ListBuilder.RowBuilder {
+ ctor public RowBuilderDsl();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/slices/builders/ktx/api/res-1.0.0-alpha07.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to slices/builders/ktx/api/res-1.0.0-alpha07.txt
diff --git a/slices/builders/ktx/src/main/java/androidx/slice/builders/ListBuilder.kt b/slices/builders/ktx/src/main/java/androidx/slice/builders/ListBuilder.kt
index cc31148..d7100d7 100644
--- a/slices/builders/ktx/src/main/java/androidx/slice/builders/ListBuilder.kt
+++ b/slices/builders/ktx/src/main/java/androidx/slice/builders/ListBuilder.kt
@@ -15,7 +15,6 @@
*/
package androidx.slice.builders
-import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Context
import android.net.Uri
@@ -144,7 +143,6 @@
/**
* Factory method to build a tappable [SliceAction].
*/
-@SuppressLint("RestrictedApi")
fun tapSliceAction(
pendingIntent: PendingIntent,
icon: IconCompat,
@@ -155,7 +153,6 @@
/**
* Factory method to build a toggleable [SliceAction].
*/
-@SuppressLint("RestrictedApi")
fun toggleSliceAction(
pendingIntent: PendingIntent,
icon: IconCompat? = null,
diff --git a/slices/builders/src/main/java/androidx/slice/builders/ListBuilder.java b/slices/builders/src/main/java/androidx/slice/builders/ListBuilder.java
index 67e356b..abada04 100644
--- a/slices/builders/src/main/java/androidx/slice/builders/ListBuilder.java
+++ b/slices/builders/src/main/java/androidx/slice/builders/ListBuilder.java
@@ -17,7 +17,7 @@
package androidx.slice.builders;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.PendingIntent;
import android.content.Context;
@@ -1470,7 +1470,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public HeaderBuilder(Uri uri) {
mUri = uri;
}
diff --git a/slices/builders/src/main/java/androidx/slice/builders/MessagingSliceBuilder.java b/slices/builders/src/main/java/androidx/slice/builders/MessagingSliceBuilder.java
index 9a16fd2..e91c43f 100644
--- a/slices/builders/src/main/java/androidx/slice/builders/MessagingSliceBuilder.java
+++ b/slices/builders/src/main/java/androidx/slice/builders/MessagingSliceBuilder.java
@@ -17,7 +17,7 @@
package androidx.slice.builders;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.drawable.Icon;
@@ -40,7 +40,7 @@
* Builder to construct slice content in a messaging format.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class MessagingSliceBuilder extends TemplateSliceBuilder {
diff --git a/slices/builders/src/main/java/androidx/slice/builders/SliceAction.java b/slices/builders/src/main/java/androidx/slice/builders/SliceAction.java
index 3fbe6fd..3906a39 100644
--- a/slices/builders/src/main/java/androidx/slice/builders/SliceAction.java
+++ b/slices/builders/src/main/java/androidx/slice/builders/SliceAction.java
@@ -17,6 +17,7 @@
package androidx.slice.builders;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
import static androidx.slice.builders.ListBuilder.ICON_IMAGE;
import android.app.PendingIntent;
@@ -103,7 +104,7 @@
* @see ListBuilder#LARGE_IMAGE
* @hide
*/
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP)
public SliceAction(@NonNull PendingIntent action, @NonNull IconCompat actionIcon,
@ListBuilder.ImageMode int imageMode, @NonNull CharSequence actionTitle) {
mSliceAction = new SliceActionImpl(action, actionIcon, imageMode, actionTitle);
@@ -120,7 +121,7 @@
* @param isChecked the state of the toggle.
* @hide
*/
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP)
public SliceAction(@NonNull PendingIntent action, @NonNull IconCompat actionIcon,
@NonNull CharSequence actionTitle, boolean isChecked) {
mSliceAction = new SliceActionImpl(action, actionIcon, actionTitle, isChecked);
@@ -135,7 +136,7 @@
* @param isChecked the state of the toggle.
* @hide
*/
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP)
public SliceAction(@NonNull PendingIntent action, @NonNull CharSequence actionTitle,
boolean isChecked) {
mSliceAction = new SliceActionImpl(action, actionTitle, isChecked);
diff --git a/slices/builders/src/main/java/androidx/slice/builders/TemplateSliceBuilder.java b/slices/builders/src/main/java/androidx/slice/builders/TemplateSliceBuilder.java
index 737b362..dd9464c 100644
--- a/slices/builders/src/main/java/androidx/slice/builders/TemplateSliceBuilder.java
+++ b/slices/builders/src/main/java/androidx/slice/builders/TemplateSliceBuilder.java
@@ -18,7 +18,6 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.net.Uri;
import android.util.Pair;
@@ -121,7 +120,6 @@
return false;
}
- @SuppressLint("RestrictedApi")
private List<SliceSpec> getSpecs(Uri uri) {
if (SliceProvider.getCurrentSpecs() != null) {
return new ArrayList<>(SliceProvider.getCurrentSpecs());
@@ -134,7 +132,6 @@
* @hide
*/
@RestrictTo(LIBRARY)
- @SuppressLint("RestrictedApi")
protected Clock getClock() {
if (SliceProvider.getClock() != null) {
return SliceProvider.getClock();
diff --git a/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderBasicImpl.java b/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderBasicImpl.java
index f9936a4..4fad6d9 100644
--- a/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderBasicImpl.java
+++ b/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderBasicImpl.java
@@ -28,7 +28,6 @@
import static androidx.slice.builders.ListBuilder.INFINITY;
import static androidx.slice.core.SliceHints.SUBTYPE_MILLIS;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import androidx.annotation.ColorInt;
@@ -241,7 +240,6 @@
/**
*/
@Override
- @SuppressLint("RestrictedApi")
public void apply(Slice.Builder builder) {
if (mIsError) {
builder.addHints(HINT_ERROR);
diff --git a/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderImpl.java b/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderImpl.java
index e3feac4..9c7bb1a 100644
--- a/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderImpl.java
+++ b/slices/builders/src/main/java/androidx/slice/builders/impl/ListBuilderImpl.java
@@ -46,7 +46,6 @@
import static androidx.slice.core.SliceHints.SUBTYPE_MILLIS;
import static androidx.slice.core.SliceHints.SUBTYPE_MIN;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.net.Uri;
@@ -552,7 +551,6 @@
/**
*/
- @SuppressLint("RestrictedApi")
private void setTitle(CharSequence title, boolean isLoading) {
mTitleItem = new SliceItem(title, FORMAT_TEXT, null, new String[] {HINT_TITLE});
if (isLoading) {
@@ -569,7 +567,6 @@
/**
*/
- @SuppressLint("RestrictedApi")
private void setSubtitle(CharSequence subtitle, boolean isLoading) {
mSubtitleItem = new SliceItem(subtitle, FORMAT_TEXT, null, new String[0]);
if (isLoading) {
@@ -646,7 +643,6 @@
/**
*/
@Override
- @SuppressLint("RestrictedApi")
public void apply(Slice.Builder b) {
if (mStartItem != null) {
b.addSubSlice(mStartItem);
@@ -717,7 +713,6 @@
/**
*/
@Override
- @SuppressLint("RestrictedApi")
public void apply(Slice.Builder b) {
if (mTitleItem != null) {
b.addItem(mTitleItem);
@@ -741,7 +736,6 @@
/**
*/
- @SuppressLint("RestrictedApi")
private void setTitle(CharSequence title, boolean isLoading) {
mTitleItem = new SliceItem(title, FORMAT_TEXT, null, new String[] {HINT_TITLE});
if (isLoading) {
@@ -751,7 +745,6 @@
/**
*/
- @SuppressLint("RestrictedApi")
private void setSubtitle(CharSequence subtitle, boolean isLoading) {
mSubtitleItem = new SliceItem(subtitle, FORMAT_TEXT, null, new String[0]);
if (isLoading) {
@@ -761,7 +754,6 @@
/**
*/
- @SuppressLint("RestrictedApi")
private void setSummary(CharSequence summarySubtitle, boolean isLoading) {
mSummaryItem = new SliceItem(summarySubtitle, FORMAT_TEXT, null,
new String[] {HINT_SUMMARY});
diff --git a/slices/core/api/1.1.0-alpha01.txt b/slices/core/api/1.1.0-alpha01.txt
index 71a21ad..b1999c8 100644
--- a/slices/core/api/1.1.0-alpha01.txt
+++ b/slices/core/api/1.1.0-alpha01.txt
@@ -63,7 +63,7 @@
public abstract class SliceProviderWithCallbacks<T extends androidx.slice.SliceProviderWithCallbacks> extends androidx.slice.SliceProvider implements androidx.remotecallback.CallbackBase<T> androidx.remotecallback.CallbackReceiver<T> {
ctor public SliceProviderWithCallbacks();
method public T! createRemoteCallback(android.content.Context!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.remotecallback.RemoteCallback! toRemoteCallback(Class<T>!, android.content.Context!, String!, android.os.Bundle!, String!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback! toRemoteCallback(Class<T>!, android.content.Context!, String!, android.os.Bundle!, String!);
}
}
diff --git a/slices/core/api/current.txt b/slices/core/api/current.txt
index 71a21ad..b1999c8 100644
--- a/slices/core/api/current.txt
+++ b/slices/core/api/current.txt
@@ -63,7 +63,7 @@
public abstract class SliceProviderWithCallbacks<T extends androidx.slice.SliceProviderWithCallbacks> extends androidx.slice.SliceProvider implements androidx.remotecallback.CallbackBase<T> androidx.remotecallback.CallbackReceiver<T> {
ctor public SliceProviderWithCallbacks();
method public T! createRemoteCallback(android.content.Context!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.remotecallback.RemoteCallback! toRemoteCallback(Class<T>!, android.content.Context!, String!, android.os.Bundle!, String!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback! toRemoteCallback(Class<T>!, android.content.Context!, String!, android.os.Bundle!, String!);
}
}
diff --git a/slices/core/build.gradle b/slices/core/build.gradle
index 08eec16..6fb3c0d 100644
--- a/slices/core/build.gradle
+++ b/slices/core/build.gradle
@@ -26,7 +26,7 @@
dependencies {
implementation project(":annotation")
implementation project(":appcompat")
- implementation project(":collection")
+ api project(":collection")
api(project(":remotecallback"))
androidTestImplementation(TEST_EXT_JUNIT)
diff --git a/slices/core/src/main/java/androidx/slice/ArrayUtils.java b/slices/core/src/main/java/androidx/slice/ArrayUtils.java
index 1b72f27..2330507 100644
--- a/slices/core/src/main/java/androidx/slice/ArrayUtils.java
+++ b/slices/core/src/main/java/androidx/slice/ArrayUtils.java
@@ -26,7 +26,7 @@
/**
* @hide
*/
-@RestrictTo(Scope.LIBRARY)
+@RestrictTo(Scope.LIBRARY_GROUP)
@RequiresApi(19)
class ArrayUtils {
diff --git a/slices/core/src/main/java/androidx/slice/Clock.java b/slices/core/src/main/java/androidx/slice/Clock.java
index d2507e8..a1b758e 100644
--- a/slices/core/src/main/java/androidx/slice/Clock.java
+++ b/slices/core/src/main/java/androidx/slice/Clock.java
@@ -16,7 +16,7 @@
package androidx.slice;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
@@ -24,7 +24,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public interface Clock {
long currentTimeMillis();
diff --git a/slices/core/src/main/java/androidx/slice/Slice.java b/slices/core/src/main/java/androidx/slice/Slice.java
index 2bd8dda..2aa2fe6 100644
--- a/slices/core/src/main/java/androidx/slice/Slice.java
+++ b/slices/core/src/main/java/androidx/slice/Slice.java
@@ -47,7 +47,6 @@
import static androidx.slice.core.SliceHints.HINT_CACHED;
import static androidx.slice.core.SliceHints.HINT_SELECTION_OPTION_VALUE;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.app.slice.SliceManager;
@@ -89,7 +88,6 @@
*/
@VersionedParcelize(allowSerialization = true, isCustom = true)
@RequiresApi(19)
-@SuppressLint("RestrictedApi")
public final class Slice extends CustomVersionedParcelable implements VersionedParcelable {
/**
@@ -209,7 +207,7 @@
* @return The spec for this slice
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public @Nullable SliceSpec getSpec() {
return mSpec;
}
@@ -255,7 +253,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY_GROUP)
+ @RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
public boolean hasHint(@SliceHint String hint) {
return ArrayUtils.contains(mHints, hint);
}
@@ -263,7 +261,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public void onPreParceling(boolean isStream) {
}
@@ -271,7 +269,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public void onPostParceling() {
for (int i = mItems.length - 1; i >= 0; i--) {
@@ -288,7 +286,7 @@
* A Builder used to construct {@link Slice}s
* @hide
*/
- @RestrictTo(Scope.LIBRARY_GROUP)
+ @RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
public static class Builder {
private final Uri mUri;
@@ -323,7 +321,7 @@
* Add the spec for this slice.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public Builder setSpec(SliceSpec spec) {
mSpec = spec;
return this;
@@ -446,7 +444,7 @@
* @see SliceItem#getSubType()
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public Slice.Builder addRemoteInput(RemoteInput remoteInput, @Nullable String subType,
@SliceHint List<String> hints) {
Preconditions.checkNotNull(remoteInput);
@@ -459,7 +457,7 @@
* @see SliceItem#getSubType()
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public Slice.Builder addRemoteInput(RemoteInput remoteInput, @Nullable String subType,
@SliceHint String... hints) {
Preconditions.checkNotNull(remoteInput);
@@ -536,7 +534,7 @@
* Add a SliceItem to the slice being constructed.
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public Slice.Builder addItem(SliceItem item) {
mItems.add(item);
return this;
@@ -610,7 +608,7 @@
* @return The Slice provided by the app or null if none is given.
* @see Slice
*/
- @RestrictTo(Scope.LIBRARY_GROUP)
+ @RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
@Nullable
public static Slice bindSlice(Context context, @NonNull Uri uri,
Set<SliceSpec> supportedSpecs) {
diff --git a/slices/core/src/main/java/androidx/slice/SliceItem.java b/slices/core/src/main/java/androidx/slice/SliceItem.java
index ffdab12..1457e22 100644
--- a/slices/core/src/main/java/androidx/slice/SliceItem.java
+++ b/slices/core/src/main/java/androidx/slice/SliceItem.java
@@ -26,7 +26,6 @@
import static androidx.slice.Slice.appendHints;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.Context;
@@ -85,7 +84,6 @@
*/
@VersionedParcelize(allowSerialization = true, ignoreParcelables = true, isCustom = true)
@RequiresApi(19)
-@SuppressLint("RestrictedApi")
public final class SliceItem extends CustomVersionedParcelable {
private static final String HINTS = "hints";
@@ -127,7 +125,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public SliceItem(Object obj, @SliceType String format, String subType,
@Slice.SliceHint String[] hints) {
mHints = hints;
@@ -139,7 +137,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public SliceItem(Object obj, @SliceType String format, String subType,
@Slice.SliceHint List<String> hints) {
this (obj, format, subType, hints.toArray(new String[hints.size()]));
@@ -149,14 +147,14 @@
* Used by VersionedParcelable.
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public SliceItem() {
}
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public SliceItem(PendingIntent intent, Slice slice, String format, String subType,
@Slice.SliceHint String[] hints) {
this(new Pair<Object, Slice>(intent, slice), format, subType, hints);
@@ -165,7 +163,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public SliceItem(ActionHandler action, Slice slice, String format, String subType,
@Slice.SliceHint String[] hints) {
this(new Pair<Object, Slice>(action, slice), format, subType, hints);
@@ -191,7 +189,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public void addHint(@Slice.SliceHint String hint) {
mHints = ArrayUtils.appendElement(String.class, mHints, hint);
}
@@ -238,7 +236,7 @@
* @return The text held by this {@link android.app.slice.SliceItem#FORMAT_TEXT} SliceItem with
* ony spans that are unsupported by the androidx Slice renderer removed.
*/
- @RestrictTo(Scope.LIBRARY_GROUP)
+ @RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
public CharSequence getSanitizedText() {
if (mSanitizedText == null) mSanitizedText = sanitizeText(getText());
return mSanitizedText;
@@ -287,7 +285,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY_GROUP)
+ @RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
public boolean fireActionInternal(@Nullable Context context, @Nullable Intent i)
throws PendingIntent.CanceledException {
Object action = ((Pair<Object, Slice>) mObj).first;
@@ -306,7 +304,7 @@
* @hide
*/
@RequiresApi(20)
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public RemoteInput getRemoteInput() {
return (RemoteInput) mObj;
}
@@ -387,7 +385,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY)
+ @RestrictTo(Scope.LIBRARY_GROUP)
public boolean hasAnyHints(@Slice.SliceHint String... hints) {
if (hints == null) return false;
for (String hint : hints) {
@@ -694,7 +692,7 @@
/**
* @hide
*/
- @RestrictTo(Scope.LIBRARY_GROUP)
+ @RestrictTo(Scope.LIBRARY_GROUP_PREFIX)
public interface ActionHandler {
/**
* Called when a pending intent would be sent on a real slice.
diff --git a/slices/core/src/main/java/androidx/slice/SliceManager.java b/slices/core/src/main/java/androidx/slice/SliceManager.java
index 710f747..e0baa5e 100644
--- a/slices/core/src/main/java/androidx/slice/SliceManager.java
+++ b/slices/core/src/main/java/androidx/slice/SliceManager.java
@@ -64,7 +64,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public abstract @NonNull Set<SliceSpec> getPinnedSpecs(@NonNull Uri uri);
/**
diff --git a/slices/core/src/main/java/androidx/slice/SliceProvider.java b/slices/core/src/main/java/androidx/slice/SliceProvider.java
index 10bc5fc..397db68 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProvider.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProvider.java
@@ -239,7 +239,7 @@
* Generate a slice that contains a permission request.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public static Slice createPermissionSlice(Context context, Uri sliceUri,
String callingPackage) {
@@ -271,7 +271,7 @@
* Create a PendingIntent pointing at the permission dialog.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public static PendingIntent createPermissionIntent(Context context, Uri sliceUri,
String callingPackage) {
@@ -292,7 +292,7 @@
* Get string describing permission request.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public static CharSequence getPermissionString(Context context, String callingPackage) {
PackageManager pm = context.getPackageManager();
@@ -483,7 +483,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public static Set<SliceSpec> getCurrentSpecs() {
return sSpecs;
@@ -501,7 +501,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@RequiresApi(19)
public static Clock getClock() {
return sClock;
diff --git a/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java b/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
index 75ed987..c73a9ea 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
@@ -16,7 +16,7 @@
package androidx.slice;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.remotecallback.ProviderRelayReceiver.ACTION_PROVIDER_RELAY;
import static androidx.remotecallback.RemoteCallback.EXTRA_METHOD;
import static androidx.remotecallback.RemoteCallback.TYPE_PROVIDER;
@@ -74,7 +74,7 @@
* @hide
*/
@Override
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteCallback toRemoteCallback(Class<T> cls, Context context, String authority,
Bundle args, String method) {
if (authority == null) {
diff --git a/slices/core/src/main/java/androidx/slice/SliceSpec.java b/slices/core/src/main/java/androidx/slice/SliceSpec.java
index 87dbdb2..747b136 100644
--- a/slices/core/src/main/java/androidx/slice/SliceSpec.java
+++ b/slices/core/src/main/java/androidx/slice/SliceSpec.java
@@ -43,7 +43,7 @@
* @see Slice
* @see SliceProvider#onBindSlice(Uri)
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@VersionedParcelize(allowSerialization = true)
@RequiresApi(19)
public final class SliceSpec implements VersionedParcelable {
diff --git a/slices/core/src/main/java/androidx/slice/SliceSpecs.java b/slices/core/src/main/java/androidx/slice/SliceSpecs.java
index 0c2c237..0374db9 100644
--- a/slices/core/src/main/java/androidx/slice/SliceSpecs.java
+++ b/slices/core/src/main/java/androidx/slice/SliceSpecs.java
@@ -23,7 +23,7 @@
* Constants for each of the slice specs
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class SliceSpecs {
diff --git a/slices/core/src/main/java/androidx/slice/SystemClock.java b/slices/core/src/main/java/androidx/slice/SystemClock.java
index 6b8c59c..4b740f3 100644
--- a/slices/core/src/main/java/androidx/slice/SystemClock.java
+++ b/slices/core/src/main/java/androidx/slice/SystemClock.java
@@ -16,7 +16,7 @@
package androidx.slice;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
@@ -24,7 +24,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class SystemClock implements Clock {
@Override
diff --git a/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java b/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
index 17614c9..630b212 100644
--- a/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
+++ b/slices/core/src/main/java/androidx/slice/compat/SliceProviderCompat.java
@@ -22,7 +22,6 @@
import static androidx.core.content.PermissionChecker.PERMISSION_DENIED;
import static androidx.core.content.PermissionChecker.PERMISSION_GRANTED;
-import android.annotation.SuppressLint;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
@@ -65,7 +64,7 @@
/**
* @hide
*/
-@RestrictTo(Scope.LIBRARY)
+@RestrictTo(Scope.LIBRARY_GROUP)
@RequiresApi(19)
public class SliceProviderCompat {
public static final String PERMS_PREFIX = "slice_perms_";
@@ -139,7 +138,6 @@
/**
* Called by SliceProvider when compat is needed.
*/
- @SuppressLint("RestrictedApi")
public Bundle call(String method, String arg, Bundle extras) {
if (method.equals(METHOD_SLICE)) {
Uri uri = extras.getParcelable(EXTRA_BIND_URI);
@@ -419,7 +417,6 @@
}
}
- @SuppressLint("RestrictedApi")
private static Slice parseSlice(final Context context, Bundle res) {
if (res == null) {
return null;
diff --git a/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java b/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java
index 891985b..b642ac9 100644
--- a/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java
+++ b/slices/core/src/main/java/androidx/slice/core/SliceActionImpl.java
@@ -29,8 +29,8 @@
import static android.app.slice.SliceItem.FORMAT_INT;
import static android.app.slice.SliceItem.FORMAT_TEXT;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.slice.core.SliceHints.ICON_IMAGE;
import static androidx.slice.core.SliceHints.LARGE_IMAGE;
import static androidx.slice.core.SliceHints.SMALL_IMAGE;
@@ -52,7 +52,7 @@
* Class representing an action, supports tappable icons, custom toggle icons, and default toggles.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class SliceActionImpl implements SliceAction {
@@ -147,7 +147,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP)
public SliceActionImpl(SliceItem slice) {
mSliceItem = slice;
SliceItem actionItem = SliceQuery.find(slice, FORMAT_ACTION);
@@ -225,7 +225,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public SliceItem getActionItem() {
return mActionItem;
}
diff --git a/slices/core/src/main/java/androidx/slice/core/SliceHints.java b/slices/core/src/main/java/androidx/slice/core/SliceHints.java
index 04c2ca9..28de8ca 100644
--- a/slices/core/src/main/java/androidx/slice/core/SliceHints.java
+++ b/slices/core/src/main/java/androidx/slice/core/SliceHints.java
@@ -16,7 +16,7 @@
package androidx.slice.core;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -30,7 +30,7 @@
* Temporary class to contain hint constants for slices to be used.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class SliceHints {
diff --git a/slices/core/src/main/java/androidx/slice/core/SliceQuery.java b/slices/core/src/main/java/androidx/slice/core/SliceQuery.java
index e687e85..9665874 100644
--- a/slices/core/src/main/java/androidx/slice/core/SliceQuery.java
+++ b/slices/core/src/main/java/androidx/slice/core/SliceQuery.java
@@ -37,7 +37,7 @@
* Utilities for finding content within a Slice.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class SliceQuery {
@@ -298,7 +298,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static SliceItem findItem(Slice s, final Uri uri) {
return findSliceItem(toQueue(s), new Filter<SliceItem>() {
@Override
diff --git a/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java b/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
index 15e9b23..c31eff0f 100644
--- a/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
+++ b/slices/view/src/androidTest/java/androidx/slice/SliceMetadataTest.java
@@ -485,6 +485,16 @@
}
@Test
+ public void testGetToggleEmptySlice() {
+ Uri uri = Uri.parse("content://pkg/slice");
+
+ ListBuilder lb = new ListBuilder(mContext, uri, ListBuilder.INFINITY);
+ Slice rowSlice = lb.build();
+ SliceMetadata rowInfo = SliceMetadata.from(mContext, rowSlice);
+ assertTrue(rowInfo.getToggles().isEmpty());
+ }
+
+ @Test
public void testSendToggleAction() {
final AtomicBoolean toggleState = new AtomicBoolean(true);
final CountDownLatch latch = new CountDownLatch(3);
diff --git a/slices/view/src/main/java/androidx/slice/SliceMetadata.java b/slices/view/src/main/java/androidx/slice/SliceMetadata.java
index d08403e..257963d 100644
--- a/slices/view/src/main/java/androidx/slice/SliceMetadata.java
+++ b/slices/view/src/main/java/androidx/slice/SliceMetadata.java
@@ -40,7 +40,6 @@
import static androidx.slice.widget.EventInfo.ROW_TYPE_PROGRESS;
import static androidx.slice.widget.EventInfo.ROW_TYPE_SLIDER;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -126,7 +125,6 @@
* @param context the context to use for the slice.
* @param slice the slice to extract metadata from.
*/
- @SuppressLint("RestrictedApi")
private SliceMetadata(@NonNull Context context, @NonNull Slice slice) {
mSlice = slice;
mContext = context;
@@ -243,8 +241,8 @@
toggles.add(action);
}
}
- } else {
- toggles = mHeaderContent.getToggleItems();
+ } else if (mHeaderContent != null) {
+ toggles.addAll(mHeaderContent.getToggleItems());
}
return toggles;
}
@@ -453,7 +451,6 @@
*/
@Nullable
@RestrictTo(RestrictTo.Scope.LIBRARY)
- @SuppressLint("RestrictedApi")
public static List<SliceAction> getSliceActions(@NonNull Slice slice) {
SliceItem actionGroup = SliceQuery.find(slice, FORMAT_SLICE, HINT_ACTIONS, null);
String[] hints = new String[] {HINT_ACTIONS, HINT_SHORTCUT};
@@ -501,7 +498,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public ListContent getListContent() {
return mListContent;
}
diff --git a/slices/view/src/main/java/androidx/slice/SliceUtils.java b/slices/view/src/main/java/androidx/slice/SliceUtils.java
index da0f16d..9c2f258 100644
--- a/slices/view/src/main/java/androidx/slice/SliceUtils.java
+++ b/slices/view/src/main/java/androidx/slice/SliceUtils.java
@@ -32,7 +32,6 @@
import static java.lang.annotation.RetentionPolicy.SOURCE;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -86,7 +85,6 @@
* original slice if no content can be removed.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static Slice stripSlice(@NonNull Slice s, @SliceMode int mode, boolean isScrollable) {
ListContent listContent = new ListContent(s);
if (listContent.isValid()) {
@@ -186,7 +184,6 @@
* @param options Options defining how to handle non-serializable items.
* @throws IllegalArgumentException if the slice cannot be serialized using the given options.
*/
- @SuppressLint("RestrictedApi")
public static void serializeSlice(@NonNull Slice s, @NonNull final Context context,
@NonNull OutputStream output,
@NonNull final SerializeOptions options) throws IllegalArgumentException {
@@ -267,7 +264,6 @@
* @param listener Listener used to handle actions when reconstructing the slice.
* @throws SliceParseException if the InputStream cannot be parsed.
*/
- @SuppressLint("RestrictedApi")
public static @NonNull Slice parseSlice(@NonNull final Context context,
@NonNull InputStream input, @NonNull String encoding,
@NonNull final SliceActionListener listener) throws IOException, SliceParseException {
diff --git a/slices/view/src/main/java/androidx/slice/SliceViewManagerCompat.java b/slices/view/src/main/java/androidx/slice/SliceViewManagerCompat.java
index e970999..6ae84df 100644
--- a/slices/view/src/main/java/androidx/slice/SliceViewManagerCompat.java
+++ b/slices/view/src/main/java/androidx/slice/SliceViewManagerCompat.java
@@ -18,7 +18,6 @@
import static androidx.slice.widget.SliceLiveData.SUPPORTED_SPECS;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@@ -45,40 +44,34 @@
}
@Override
- @SuppressLint("RestrictedApi")
public void pinSlice(@NonNull Uri uri) {
SliceProviderCompat.pinSlice(mContext, uri, SliceLiveData.SUPPORTED_SPECS);
}
@Override
- @SuppressLint("RestrictedApi")
public void unpinSlice(@NonNull Uri uri) {
SliceProviderCompat.unpinSlice(mContext, uri, SliceLiveData.SUPPORTED_SPECS);
}
@Nullable
@Override
- @SuppressLint("RestrictedApi")
public Slice bindSlice(@NonNull Uri uri) {
return SliceProviderCompat.bindSlice(mContext, uri, SUPPORTED_SPECS);
}
@Nullable
@Override
- @SuppressLint("RestrictedApi")
public Slice bindSlice(@NonNull Intent intent) {
return SliceProviderCompat.bindSlice(mContext, intent, SUPPORTED_SPECS);
}
@Nullable
@Override
- @SuppressLint("RestrictedApi")
public Uri mapIntentToUri(@NonNull Intent intent) {
return SliceProviderCompat.mapIntentToUri(mContext, intent);
}
@Override
- @SuppressLint("RestrictedApi")
public Collection<Uri> getSliceDescendants(Uri uri) {
return SliceProviderCompat.getSliceDescendants(mContext, uri);
}
diff --git a/slices/view/src/main/java/androidx/slice/widget/GridContent.java b/slices/view/src/main/java/androidx/slice/widget/GridContent.java
index 67a750b..bbc8c70 100644
--- a/slices/view/src/main/java/androidx/slice/widget/GridContent.java
+++ b/slices/view/src/main/java/androidx/slice/widget/GridContent.java
@@ -35,7 +35,6 @@
import static androidx.slice.core.SliceHints.SMALL_IMAGE;
import static androidx.slice.core.SliceHints.UNKNOWN_IMAGE;
-import android.annotation.SuppressLint;
import android.app.slice.Slice;
import androidx.annotation.NonNull;
@@ -53,7 +52,7 @@
* Extracts information required to present content in a grid format from a slice.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class GridContent extends SliceContent {
@@ -126,7 +125,6 @@
* @return the title of this grid row, if it exists.
*/
@Nullable
- @SuppressLint("RestrictedApi")
public CharSequence getTitle() {
if (mTitleItem != null) {
return mTitleItem.getSanitizedText();
@@ -185,7 +183,6 @@
/**
* Filters non-cell items out of the list of items and finds content description.
*/
- @SuppressLint("RestrictedApi")
private List<SliceItem> filterAndProcessItems(List<SliceItem> items) {
List<SliceItem> filteredItems = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
@@ -239,7 +236,7 @@
* Extracts information required to present content in a cell.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static class CellContent {
private SliceItem mContentIntent;
private ArrayList<SliceItem> mCellItems = new ArrayList<>();
@@ -329,7 +326,6 @@
/**
* @return whether this is content that is valid to show in a grid cell.
*/
- @SuppressLint("RestrictedApi")
private boolean isValidCellContent(SliceItem cellItem) {
final String format = cellItem.getFormat();
boolean isNonCellContent = SUBTYPE_CONTENT_DESCRIPTION.equals(cellItem.getSubType())
diff --git a/slices/view/src/main/java/androidx/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
index f5cd190..32270a9 100644
--- a/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
@@ -30,7 +30,6 @@
import static androidx.slice.core.SliceHints.LARGE_IMAGE;
import static androidx.slice.widget.SliceView.MODE_SMALL;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.res.Resources;
@@ -313,7 +312,6 @@
/**
* Adds a cell to the grid view based on the provided {@link SliceItem}.
*/
- @SuppressLint("RestrictedApi")
private void addCell(GridContent.CellContent cell, int index, int total) {
final int maxCellText = getMode() == MODE_SMALL && mGridContent.hasImage()
? MAX_CELL_TEXT_SMALL : MAX_CELL_TEXT;
diff --git a/slices/view/src/main/java/androidx/slice/widget/ListContent.java b/slices/view/src/main/java/androidx/slice/widget/ListContent.java
index f91347d..2b28b91 100644
--- a/slices/view/src/main/java/androidx/slice/widget/ListContent.java
+++ b/slices/view/src/main/java/androidx/slice/widget/ListContent.java
@@ -31,7 +31,6 @@
import static androidx.slice.widget.SliceView.MODE_SMALL;
-import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.NonNull;
@@ -53,7 +52,7 @@
* Extracts information required to present content in a list format from a slice.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class ListContent extends SliceContent {
@@ -80,7 +79,6 @@
populate(slice);
}
- @SuppressLint("RestrictedApi")
private void populate(Slice slice) {
if (slice == null) return;
mSliceActions = SliceMetadata.getSliceActions(slice);
@@ -225,7 +223,6 @@
* @return suitable action to use for a tap on the slice template or for the shortcut.
*/
@Nullable
- @SuppressLint("RestrictedApi")
private SliceAction findPrimaryAction() {
SliceItem action = null;
if (mHeaderContent != null) {
@@ -249,7 +246,6 @@
* @param actions the actions associated with this slice, only matter if this row is the header.
* @return the type of template the provided row item represents.
*/
- @SuppressLint("RestrictedApi")
public static int getRowType(SliceContent content, boolean isHeader,
List<SliceAction> actions) {
if (content != null) {
@@ -340,7 +336,6 @@
/**
* @return whether the provided slice item is a valid header.
*/
- @SuppressLint("RestrictedApi")
private static boolean isValidHeader(SliceItem sliceItem) {
if (FORMAT_SLICE.equals(sliceItem.getFormat())
&& !sliceItem.hasAnyHints(HINT_ACTIONS, HINT_KEYWORDS, HINT_SEE_MORE)) {
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowContent.java b/slices/view/src/main/java/androidx/slice/widget/RowContent.java
index cee0b7e..72c2cf3 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowContent.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowContent.java
@@ -38,7 +38,6 @@
import static androidx.slice.core.SliceHints.SUBTYPE_SELECTION;
import static androidx.slice.core.SliceHints.SUBTYPE_SELECTION_OPTION_KEY;
-import android.annotation.SuppressLint;
import android.text.TextUtils;
import android.util.Log;
@@ -58,7 +57,7 @@
* Extracts information required to present content in a row format from a slice.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@RequiresApi(19)
public class RowContent extends SliceContent {
private static final String TAG = "RowContent";
@@ -87,7 +86,6 @@
/**
* @return whether this row has content that is valid to display.
*/
- @SuppressLint("RestrictedApi")
private boolean populate(SliceItem rowSlice, boolean isHeader) {
mIsHeader = isHeader;
if (!isValidRow(rowSlice)) {
@@ -164,7 +162,6 @@
return isValid();
}
- @SuppressLint("RestrictedApi")
private void processContent(@NonNull SliceItem item, boolean isAction) {
if (isAction) {
SliceAction ac = new SliceActionImpl(item);
@@ -430,7 +427,6 @@
/**
* @return whether this item is valid content to visibly appear in a row.
*/
- @SuppressLint("RestrictedApi")
private static boolean isValidRowContent(SliceItem slice, SliceItem item) {
// XXX: This is fragile -- new subtypes may be erroneously displayed by old clients, since
// this is effectively a blocklist, not an allowlist. I'm not sure if SELECTION_OPTION_KEY
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowView.java b/slices/view/src/main/java/androidx/slice/widget/RowView.java
index 7c00f3a..a710afb0 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowView.java
@@ -39,7 +39,6 @@
import static androidx.slice.widget.EventInfo.ROW_TYPE_TOGGLE;
import static androidx.slice.widget.SliceView.MODE_SMALL;
-import android.annotation.SuppressLint;
import android.app.PendingIntent.CanceledException;
import android.content.Context;
import android.content.Intent;
@@ -366,7 +365,6 @@
populateViews(isUpdate);
}
- @SuppressLint("RestrictedApi")
private void populateViews(boolean isUpdate) {
boolean skipSliderUpdate = isUpdate && mIsRangeSliding;
if (!skipSliderUpdate) {
@@ -734,7 +732,6 @@
* Adds simple items to a container. Simple items include actions with icons, images, or
* timestamps.
*/
- @SuppressLint("RestrictedApi")
private boolean addItem(SliceItem sliceItem, int color, boolean isStart) {
IconCompat icon = null;
int imageMode = 0;
diff --git a/slices/view/src/main/java/androidx/slice/widget/SliceContent.java b/slices/view/src/main/java/androidx/slice/widget/SliceContent.java
index cc9420a..75f3c87 100644
--- a/slices/view/src/main/java/androidx/slice/widget/SliceContent.java
+++ b/slices/view/src/main/java/androidx/slice/widget/SliceContent.java
@@ -35,7 +35,6 @@
import static androidx.slice.core.SliceHints.UNKNOWN_IMAGE;
import static androidx.slice.widget.SliceViewUtil.resolveLayoutDirection;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -69,7 +68,6 @@
protected SliceItem mContentDescr;
protected int mRowIndex;
- @SuppressLint("RestrictedApi")
public SliceContent(Slice slice) {
if (slice == null) return;
init(new SliceItem(slice, FORMAT_SLICE, null, slice.getHints()));
@@ -202,7 +200,6 @@
return null;
}
- @SuppressLint("RestrictedApi")
private SliceAction fallBackToAppData(Context context, SliceItem textItem, SliceItem iconItem,
int iconMode, SliceItem actionItem) {
SliceItem slice = SliceQuery.find(mSliceItem, FORMAT_SLICE, (String) null, null);
diff --git a/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java b/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java
index 8d50336..d0a1228 100644
--- a/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java
+++ b/slices/view/src/main/java/androidx/slice/widget/SliceLiveData.java
@@ -16,7 +16,7 @@
package androidx.slice.widget;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.PendingIntent;
import android.content.Context;
@@ -123,7 +123,7 @@
* Version for testing
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@NonNull
public static CachedSliceLiveData fromStream(@NonNull Context context,
SliceViewManager manager, @NonNull InputStream input, OnErrorListener listener) {
diff --git a/slidingpanelayout/api/1.1.0-alpha01.txt b/slidingpanelayout/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..fc3aa2f
--- /dev/null
+++ b/slidingpanelayout/api/1.1.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.slidingpanelayout.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 @Deprecated public boolean canSlide();
+ method public boolean closePane();
+ method @ColorInt public int getCoveredFadeColor();
+ method @Px public int getParallaxDistance();
+ method @ColorInt public int getSliderFadeColor();
+ method public boolean isOpen();
+ method public boolean isSlideable();
+ method public boolean openPane();
+ method public void setCoveredFadeColor(@ColorInt int);
+ method public void setPanelSlideListener(androidx.slidingpanelayout.widget.SlidingPaneLayout.PanelSlideListener?);
+ method public void setParallaxDistance(@Px int);
+ method @Deprecated public void setShadowDrawable(android.graphics.drawable.Drawable!);
+ method public void setShadowDrawableLeft(android.graphics.drawable.Drawable?);
+ method public void setShadowDrawableRight(android.graphics.drawable.Drawable?);
+ method @Deprecated public void setShadowResource(@DrawableRes int);
+ method public void setShadowResourceLeft(int);
+ method public void setShadowResourceRight(int);
+ method public void setSliderFadeColor(@ColorInt int);
+ method @Deprecated public void smoothSlideClosed();
+ method @Deprecated public 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(androidx.slidingpanelayout.widget.SlidingPaneLayout.LayoutParams);
+ ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
+ field public float weight;
+ }
+
+ public static interface SlidingPaneLayout.PanelSlideListener {
+ method public void onPanelClosed(android.view.View);
+ method public void onPanelOpened(android.view.View);
+ method public void onPanelSlide(android.view.View, float);
+ }
+
+ public static class SlidingPaneLayout.SimplePanelSlideListener implements androidx.slidingpanelayout.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/savedstate/bundle/api/res-1.0.0-alpha01.txt b/slidingpanelayout/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to slidingpanelayout/api/res-1.1.0-alpha01.txt
diff --git a/studiow b/studiow
index 5e68ec6..62b46b1 100755
--- a/studiow
+++ b/studiow
@@ -43,12 +43,32 @@
mv "${tempPath}" "${destPath}"
}
+function findStudioMacAppPath() {
+ echo "$(find "${studioUnzippedPath}" -type d -depth 1 -name "Android Studio*.app")"
+}
+
+function getLicensePath() {
+ if [ "${osName}" == "mac" ]; then
+ appPath="$(findStudioMacAppPath)"
+ echo "${appPath}/Contents/Resources/LICENSE.txt"
+ else
+ echo "${studioUnzippedPath}/android-studio/LICENSE.txt"
+ fi
+}
+
function checkLicenseAgreement() {
# TODO: Is there a more official way to check that the user accepts the license?
- if [ "${acceptsLicenseAgreement}" != "-y" ]; then
- echo "Do you accept the license agreement at ${studioUnzippedPath}/android-studio/LICENSE.txt ?"
- echo "If you do, then rerun this script with a '-y' argument"
- exit 1
+
+ licenseAcceptedPath="${studioUnzippedPath}/STUDIOW_LICENSE_ACCEPTED"
+
+ if [ ! -f "${licenseAcceptedPath}" ]; then
+ if [ "${acceptsLicenseAgreement}" == "-y" ]; then
+ touch "${licenseAcceptedPath}"
+ else
+ echo "Do you accept the license agreement at $(getLicensePath) ?"
+ echo "If you do, then rerun this script with a '-y' argument"
+ exit 1
+ fi
fi
}
@@ -79,11 +99,11 @@
}
function runStudioMac() {
- studioPath="${studioUnzippedPath}/Android Studio.app"
- echo "open ${studioPath}"
+ appPath="$(findStudioMacAppPath)"
+ echo "open ${appPath}"
env STUDIO_PROPERTIES="${projectDir}/development/studio/idea.properties" \
STUDIO_VM_OPTIONS="${projectDir}/development/studio/studio.vmoptions" \
- open -a "${studioPath}" "${projectDir}"
+ open -a "${appPath}" "${projectDir}"
}
function runStudio() {
diff --git a/swiperefreshlayout/build.gradle b/swiperefreshlayout/build.gradle
index dbf32ef2..8248007 100644
--- a/swiperefreshlayout/build.gradle
+++ b/swiperefreshlayout/build.gradle
@@ -7,7 +7,7 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":annotation"))
api(project(":core"))
api("androidx.interpolator:interpolator:1.0.0")
diff --git a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircularProgressDrawable.java b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircularProgressDrawable.java
index c862104..d397f84 100644
--- a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircularProgressDrawable.java
+++ b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircularProgressDrawable.java
@@ -16,7 +16,7 @@
package androidx.swiperefreshlayout.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.ValueAnimator;
@@ -68,7 +68,7 @@
private static final Interpolator MATERIAL_INTERPOLATOR = new FastOutSlowInInterpolator();
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef({LARGE, DEFAULT})
public @interface ProgressDrawableSize {
diff --git a/testutils/src/main/java/androidx/testutils/LifecycleOwnerUtils.java b/testutils/src/main/java/androidx/testutils/LifecycleOwnerUtils.java
new file mode 100644
index 0000000..dcf4320
--- /dev/null
+++ b/testutils/src/main/java/androidx/testutils/LifecycleOwnerUtils.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.testutils;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.OnLifecycleEvent;
+import androidx.test.rule.ActivityTestRule;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Utility methods for testing LifecycleOwners
+ */
+public class LifecycleOwnerUtils {
+ private static final Runnable DO_NOTHING = new Runnable() {
+ @Override
+ public void run() {
+ }
+ };
+
+ /**
+ * Waits until the given {@link LifecycleOwner} has the specified
+ * {@link androidx.lifecycle.Lifecycle.State}. If the owner has not hit that state within a
+ * suitable time period, it asserts that the current state equals the given state.
+ */
+ public static void waitUntilState(final LifecycleOwner owner,
+ final ActivityTestRule<?> activityRule,
+ final Lifecycle.State state) throws Throwable {
+ final CountDownLatch latch = new CountDownLatch(1);
+ activityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final Lifecycle.State currentState = owner.getLifecycle().getCurrentState();
+ if (currentState == state) {
+ latch.countDown();
+ return;
+ }
+ owner.getLifecycle().addObserver(new LifecycleObserver() {
+ @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
+ public void onStateChanged(LifecycleOwner provider) {
+ if (provider.getLifecycle().getCurrentState() == state) {
+ latch.countDown();
+ provider.getLifecycle().removeObserver(this);
+ }
+ }
+ });
+ }
+ });
+ boolean latchResult = latch.await(30, TimeUnit.SECONDS);
+ assertThat("expected " + state + " never happened. Current state:"
+ + owner.getLifecycle().getCurrentState(), latchResult, is(true));
+
+ // wait for another loop to ensure all observers are called
+ activityRule.runOnUiThread(DO_NOTHING);
+ }
+
+ private LifecycleOwnerUtils() {
+ }
+}
diff --git a/textclassifier/api/1.0.0-alpha03.txt b/textclassifier/api/1.0.0-alpha03.txt
new file mode 100644
index 0000000..043c858
--- /dev/null
+++ b/textclassifier/api/1.0.0-alpha03.txt
@@ -0,0 +1,240 @@
+// Signature format: 3.0
+package androidx.textclassifier {
+
+ public final class TextClassification {
+ method public static androidx.textclassifier.TextClassification createFromBundle(android.os.Bundle);
+ method public java.util.List<androidx.core.app.RemoteActionCompat> getActions();
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(String!);
+ method public String getEntityType(int);
+ method @IntRange(from=0) public int getEntityTypeCount();
+ method public android.os.Bundle getExtras();
+ method public String? getId();
+ method public CharSequence? getText();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextClassification.Builder {
+ ctor public TextClassification.Builder();
+ method public androidx.textclassifier.TextClassification.Builder addAction(androidx.core.app.RemoteActionCompat);
+ method public androidx.textclassifier.TextClassification build();
+ method public androidx.textclassifier.TextClassification.Builder! setEntityType(String, @FloatRange(from=0.0, to=1.0) float);
+ method public androidx.textclassifier.TextClassification.Builder setExtras(android.os.Bundle?);
+ method public androidx.textclassifier.TextClassification.Builder setId(String?);
+ method public androidx.textclassifier.TextClassification.Builder! setText(CharSequence?);
+ }
+
+ public static final class TextClassification.Request {
+ method public static androidx.textclassifier.TextClassification.Request! createFromBundle(android.os.Bundle);
+ method public androidx.core.os.LocaleListCompat? getDefaultLocales();
+ method @IntRange(from=0) public int getEndIndex();
+ method public android.os.Bundle getExtras();
+ method public Long? getReferenceTime();
+ method @IntRange(from=0) public int getStartIndex();
+ method public CharSequence getText();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextClassification.Request.Builder {
+ ctor public TextClassification.Request.Builder(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int);
+ method public androidx.textclassifier.TextClassification.Request build();
+ method public androidx.textclassifier.TextClassification.Request.Builder setDefaultLocales(androidx.core.os.LocaleListCompat?);
+ method public androidx.textclassifier.TextClassification.Request.Builder setExtras(android.os.Bundle?);
+ method public androidx.textclassifier.TextClassification.Request.Builder setReferenceTime(Long?);
+ }
+
+ public final class TextClassificationContext {
+ method public static androidx.textclassifier.TextClassificationContext createFromBundle(android.os.Bundle);
+ method public String getPackageName();
+ method public String getWidgetType();
+ method public String? getWidgetVersion();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextClassificationContext.Builder {
+ ctor public TextClassificationContext.Builder(String, String);
+ method public androidx.textclassifier.TextClassificationContext build();
+ method public androidx.textclassifier.TextClassificationContext.Builder! setWidgetVersion(String?);
+ }
+
+ public final class TextClassificationManager {
+ method public androidx.textclassifier.TextClassifier getDefaultTextClassifier();
+ method public androidx.textclassifier.TextClassifier getTextClassifier();
+ method public static androidx.textclassifier.TextClassificationManager! of(android.content.Context);
+ method public void setTextClassifier(androidx.textclassifier.TextClassifier?);
+ }
+
+ public final class TextClassificationSessionId {
+ method public static androidx.textclassifier.TextClassificationSessionId createFromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ }
+
+ public abstract class TextClassifier {
+ ctor public TextClassifier();
+ method @WorkerThread public androidx.textclassifier.TextClassification classifyText(androidx.textclassifier.TextClassification.Request);
+ method @WorkerThread public androidx.textclassifier.TextLinks generateLinks(androidx.textclassifier.TextLinks.Request);
+ method public int getMaxGenerateLinksTextLength();
+ method @WorkerThread public androidx.textclassifier.TextSelection suggestSelection(androidx.textclassifier.TextSelection.Request);
+ field public static final String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
+ field public static final String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
+ field public static final androidx.textclassifier.TextClassifier! NO_OP;
+ field public static final String TYPE_ADDRESS = "address";
+ field public static final String TYPE_DATE = "date";
+ field public static final String TYPE_DATE_TIME = "datetime";
+ field public static final String TYPE_EMAIL = "email";
+ field public static final String TYPE_FLIGHT_NUMBER = "flight";
+ field public static final String TYPE_OTHER = "other";
+ field public static final String TYPE_PHONE = "phone";
+ field public static final String TYPE_UNKNOWN = "";
+ field public static final String TYPE_URL = "url";
+ field public static final String WIDGET_TYPE_CUSTOM_EDITTEXT = "customedit";
+ field public static final String WIDGET_TYPE_CUSTOM_TEXTVIEW = "customview";
+ field public static final String WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW = "nosel-customview";
+ field public static final String WIDGET_TYPE_EDITTEXT = "edittext";
+ field public static final String WIDGET_TYPE_EDIT_WEBVIEW = "edit-webview";
+ field public static final String WIDGET_TYPE_TEXTVIEW = "textview";
+ field public static final String WIDGET_TYPE_UNKNOWN = "unknown";
+ field public static final String WIDGET_TYPE_UNSELECTABLE_TEXTVIEW = "nosel-textview";
+ field public static final String WIDGET_TYPE_WEBVIEW = "webview";
+ }
+
+ public static final class TextClassifier.EntityConfig {
+ method public static androidx.textclassifier.TextClassifier.EntityConfig createFromBundle(android.os.Bundle);
+ method public java.util.Collection<java.lang.String> getHints();
+ method public java.util.Collection<java.lang.String>! resolveEntityTypes(java.util.Collection<java.lang.String>?);
+ method public boolean shouldIncludeDefaultEntityTypes();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextClassifier.EntityConfig.Builder {
+ ctor public TextClassifier.EntityConfig.Builder();
+ method public androidx.textclassifier.TextClassifier.EntityConfig build();
+ method public androidx.textclassifier.TextClassifier.EntityConfig.Builder! setExcludedEntityTypes(java.util.Collection<java.lang.String>?);
+ method public androidx.textclassifier.TextClassifier.EntityConfig.Builder! setHints(java.util.Collection<java.lang.String>?);
+ method public androidx.textclassifier.TextClassifier.EntityConfig.Builder! setIncludeDefaultEntityTypes(boolean);
+ method public androidx.textclassifier.TextClassifier.EntityConfig.Builder! setIncludedEntityTypes(java.util.Collection<java.lang.String>?);
+ }
+
+ public final class TextLinks {
+ method public int apply(android.text.Spannable, androidx.textclassifier.TextClassifier, androidx.textclassifier.TextLinksParams);
+ method public static androidx.textclassifier.TextLinks createFromBundle(android.os.Bundle);
+ method public android.os.Bundle getExtras();
+ method public java.util.Collection<androidx.textclassifier.TextLinks.TextLink> getLinks();
+ method public android.os.Bundle toBundle();
+ field public static final int APPLY_STRATEGY_IGNORE = 0; // 0x0
+ field public static final int APPLY_STRATEGY_REPLACE = 1; // 0x1
+ field public static final int STATUS_DIFFERENT_TEXT = 3; // 0x3
+ field public static final int STATUS_LINKS_APPLIED = 0; // 0x0
+ field public static final int STATUS_NO_LINKS_APPLIED = 2; // 0x2
+ field public static final int STATUS_NO_LINKS_FOUND = 1; // 0x1
+ field public static final int STATUS_UNKNOWN = -1; // 0xffffffff
+ }
+
+ public static final class TextLinks.Builder {
+ ctor public TextLinks.Builder(CharSequence);
+ method public androidx.textclassifier.TextLinks.Builder addLink(int, int, java.util.Map<java.lang.String,java.lang.Float>);
+ method public androidx.textclassifier.TextLinks build();
+ method public androidx.textclassifier.TextLinks.Builder clearTextLinks();
+ method public androidx.textclassifier.TextLinks.Builder setExtras(android.os.Bundle?);
+ }
+
+ public static class TextLinks.DefaultTextLinkSpan extends androidx.textclassifier.TextLinks.TextLinkSpan {
+ ctor public TextLinks.DefaultTextLinkSpan(androidx.textclassifier.TextLinks.TextLinkSpanData);
+ method @CallSuper public void onClick(android.view.View);
+ method @UiThread public void onTextClassificationResult(android.widget.TextView, androidx.textclassifier.TextClassification);
+ }
+
+ public static final class TextLinks.Request {
+ method public static androidx.textclassifier.TextLinks.Request createFromBundle(android.os.Bundle);
+ method public androidx.core.os.LocaleListCompat? getDefaultLocales();
+ method public androidx.textclassifier.TextClassifier.EntityConfig getEntityConfig();
+ method public android.os.Bundle getExtras();
+ method public Long? getReferenceTime();
+ method public CharSequence getText();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextLinks.Request.Builder {
+ ctor public TextLinks.Request.Builder(CharSequence);
+ method public androidx.textclassifier.TextLinks.Request build();
+ method public androidx.textclassifier.TextLinks.Request.Builder setDefaultLocales(androidx.core.os.LocaleListCompat?);
+ method public androidx.textclassifier.TextLinks.Request.Builder setEntityConfig(androidx.textclassifier.TextClassifier.EntityConfig?);
+ method public androidx.textclassifier.TextLinks.Request.Builder setExtras(android.os.Bundle?);
+ method public androidx.textclassifier.TextLinks.Request.Builder setReferenceTime(Long?);
+ }
+
+ public static interface TextLinks.SpanFactory {
+ method public androidx.textclassifier.TextLinks.TextLinkSpan! createSpan(androidx.textclassifier.TextLinks.TextLinkSpanData);
+ }
+
+ public static final class TextLinks.TextLink {
+ method public static androidx.textclassifier.TextLinks.TextLink createFromBundle(android.os.Bundle);
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(String!);
+ method public int getEnd();
+ method public String getEntityType(int);
+ method public int getEntityTypeCount();
+ method public int getStart();
+ method public android.os.Bundle toBundle();
+ }
+
+ public abstract static class TextLinks.TextLinkSpan extends android.text.style.ClickableSpan {
+ ctor public TextLinks.TextLinkSpan(androidx.textclassifier.TextLinks.TextLinkSpanData);
+ method public final androidx.textclassifier.TextLinks.TextLinkSpanData getTextLinkSpanData();
+ }
+
+ public static class TextLinks.TextLinkSpanData {
+ method public androidx.textclassifier.TextLinks.TextLink getTextLink();
+ }
+
+ public final class TextLinksParams {
+ field public static final androidx.textclassifier.TextLinksParams! DEFAULT_PARAMS;
+ }
+
+ public static final class TextLinksParams.Builder {
+ ctor public TextLinksParams.Builder();
+ method public androidx.textclassifier.TextLinksParams build();
+ method public androidx.textclassifier.TextLinksParams.Builder setApplyStrategy(int);
+ method public androidx.textclassifier.TextLinksParams.Builder setDefaultLocales(androidx.core.os.LocaleListCompat?);
+ method public androidx.textclassifier.TextLinksParams.Builder setEntityConfig(androidx.textclassifier.TextClassifier.EntityConfig?);
+ method public androidx.textclassifier.TextLinksParams.Builder setReferenceTime(Long?);
+ method public androidx.textclassifier.TextLinksParams.Builder setSpanFactory(androidx.textclassifier.TextLinks.SpanFactory?);
+ }
+
+ public final class TextSelection {
+ method public static androidx.textclassifier.TextSelection createFromBundle(android.os.Bundle);
+ method @FloatRange(from=0.0, to=1.0) public float getConfidenceScore(String!);
+ method public String getEntityType(int);
+ method @IntRange(from=0) public int getEntityTypeCount();
+ method public android.os.Bundle getExtras();
+ method public String? getId();
+ method public int getSelectionEndIndex();
+ method public int getSelectionStartIndex();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextSelection.Builder {
+ ctor public TextSelection.Builder(@IntRange(from=0) int, @IntRange(from=0) int);
+ method public androidx.textclassifier.TextSelection build();
+ method public androidx.textclassifier.TextSelection.Builder setEntityType(String, @FloatRange(from=0.0, to=1.0) float);
+ method public androidx.textclassifier.TextSelection.Builder setExtras(android.os.Bundle?);
+ method public androidx.textclassifier.TextSelection.Builder setId(String?);
+ }
+
+ public static final class TextSelection.Request {
+ method public static androidx.textclassifier.TextSelection.Request createFromBundle(android.os.Bundle);
+ method public androidx.core.os.LocaleListCompat? getDefaultLocales();
+ method @IntRange(from=0) public int getEndIndex();
+ method public android.os.Bundle getExtras();
+ method @IntRange(from=0) public int getStartIndex();
+ method public CharSequence getText();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static final class TextSelection.Request.Builder {
+ ctor public TextSelection.Request.Builder(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int);
+ method public androidx.textclassifier.TextSelection.Request build();
+ method public androidx.textclassifier.TextSelection.Request.Builder setDefaultLocales(androidx.core.os.LocaleListCompat?);
+ method public androidx.textclassifier.TextSelection.Request.Builder setExtras(android.os.Bundle?);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/textclassifier/api/res-1.0.0-alpha03.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to textclassifier/api/res-1.0.0-alpha03.txt
diff --git a/textclassifier/build.gradle b/textclassifier/build.gradle
index 2176fb6..f9f51cd 100644
--- a/textclassifier/build.gradle
+++ b/textclassifier/build.gradle
@@ -7,8 +7,8 @@
}
dependencies {
- api("androidx.appcompat:appcompat:1.0.0")
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":appcompat"))
+ api(project(":annotation"))
implementation("androidx.collection:collection:1.0.0")
// TODO: change to 1.1.0-alpha04 after release
api(project(":core"))
diff --git a/textclassifier/src/androidTest/java/androidx/textclassifier/TextClassificationTest.java b/textclassifier/src/androidTest/java/androidx/textclassifier/TextClassificationTest.java
index 7f70783..813c9ee 100644
--- a/textclassifier/src/androidTest/java/androidx/textclassifier/TextClassificationTest.java
+++ b/textclassifier/src/androidTest/java/androidx/textclassifier/TextClassificationTest.java
@@ -27,7 +27,6 @@
import android.graphics.Color;
import android.os.Bundle;
import android.os.LocaleList;
-import android.text.SpannableString;
import androidx.core.app.RemoteActionCompat;
import androidx.core.graphics.drawable.IconCompat;
@@ -46,7 +45,7 @@
@RunWith(AndroidJUnit4.class)
public final class TextClassificationTest {
private static final Long REFERENCE_TIME_IN_MS = 946684800000L; // 2000-01-01 00:00:00
- private static final CharSequence TEXT = new SpannableString("This is an apple");
+ private static final String TEXT = "This is an apple";
private static final int START_INDEX = 2;
private static final int END_INDEX = 5;
private static final String ID = "id";
@@ -108,7 +107,7 @@
TextClassification.Request result = TextClassification.Request.createFromBundle(
reference.toBundle());
- assertEquals(TEXT, result.getText());
+ assertEquals(TEXT, result.getText().toString());
assertEquals(START_INDEX, result.getStartIndex());
assertEquals(END_INDEX, result.getEndIndex());
assertEquals(LOCALE_LIST.toLanguageTags(), result.getDefaultLocales().toLanguageTags());
@@ -124,7 +123,7 @@
TextClassification.Request result = TextClassification.Request.createFromBundle(
reference.toBundle());
- assertEquals(TEXT, result.getText());
+ assertEquals(TEXT, result.getText().toString());
assertEquals(START_INDEX, result.getStartIndex());
assertEquals(END_INDEX, result.getEndIndex());
assertEquals(null, result.getReferenceTime());
@@ -139,7 +138,7 @@
assertThat(platformRequest.getStartIndex()).isEqualTo(START_INDEX);
assertThat(platformRequest.getEndIndex()).isEqualTo(END_INDEX);
- assertThat(platformRequest.getText()).isEqualTo(TEXT);
+ assertThat(platformRequest.getText().toString()).isEqualTo(TEXT);
assertThat(platformRequest.getDefaultLocales().toLanguageTags())
.isEqualTo(LOCALE_LIST.toLanguageTags());
assertThat(platformRequest.getReferenceTime().toInstant().toEpochMilli())
@@ -163,7 +162,7 @@
assertThat(request.getStartIndex()).isEqualTo(START_INDEX);
assertThat(request.getEndIndex()).isEqualTo(END_INDEX);
- assertThat(request.getText()).isEqualTo(TEXT);
+ assertThat(request.getText().toString()).isEqualTo(TEXT);
assertThat(request.getDefaultLocales().toLanguageTags())
.isEqualTo(LOCALE_LIST.toLanguageTags());
assertThat(request.getReferenceTime()).isEqualTo(REFERENCE_TIME_IN_MS);
@@ -182,7 +181,7 @@
android.view.textclassifier.TextClassification platformTextClassification =
new android.view.textclassifier.TextClassification.Builder()
- .setText(TEXT.toString())
+ .setText(TEXT)
.addAction(remoteAction0.toRemoteAction())
.addAction(remoteAction1.toRemoteAction())
.setEntityType(TextClassifier.TYPE_ADDRESS, ADDRESS_SCORE)
@@ -201,7 +200,7 @@
public void testConvertFromPlatformTextClassification_O() {
android.view.textclassifier.TextClassification platformTextClassification =
new android.view.textclassifier.TextClassification.Builder()
- .setText(TEXT.toString())
+ .setText(TEXT)
.setEntityType(TextClassifier.TYPE_ADDRESS, ADDRESS_SCORE)
.setEntityType(TextClassifier.TYPE_PHONE, PHONE_SCORE)
.setIcon(mContext.getDrawable(R.drawable.abc_ic_star_black_16dp))
@@ -243,7 +242,7 @@
android.view.textclassifier.TextClassification platformTextClassification =
(android.view.textclassifier.TextClassification) reference.toPlatform(mContext);
- assertThat(platformTextClassification.getText()).isEqualTo(TEXT.toString());
+ assertThat(platformTextClassification.getText()).isEqualTo(TEXT);
assertThat(platformTextClassification.getIcon()).isNotNull();
assertThat(platformTextClassification.getOnClickListener()).isNotNull();
assertThat(platformTextClassification.getEntityCount()).isEqualTo(2);
@@ -252,6 +251,34 @@
assertThat(platformTextClassification.getIntent()).isNull();
}
+ // Ensures the package manager can recognize a url scheme that is not all lowercase.
+ // b/123640937
+ @Test
+ public void testNormalizeUriSchemeInRequest() {
+ // Change scheme to lower case if classifying a URI.
+ String text = "Visit hTTp://www.android.com today";
+ String expected = "Visit http://www.android.com today";
+ int startIndex = text.indexOf("hTTp://www.android.com");
+ int endIndex = startIndex + "hTTp://www.android.com".length();
+ TextClassification.Request request =
+ new TextClassification.Request.Builder(text, startIndex, endIndex).build();
+ assertThat(request.getText().toString()).isEqualTo(expected);
+
+ // No changes if classifying non-URIs.
+ text = "Visit hTTp://www.android.com today";
+ startIndex = text.indexOf("hTTp");
+ endIndex = startIndex + "hTTp".length();
+ request = new TextClassification.Request.Builder(text, startIndex, endIndex).build();
+ assertThat(request.getText().toString()).isEqualTo(text);
+
+ // No changes if classifying URLs that do not specify any scheme.
+ text = "Visit www.android.com today";
+ startIndex = text.indexOf("www.android.com");
+ endIndex = startIndex + "www.android.com".length();
+ request = new TextClassification.Request.Builder(text, startIndex, endIndex).build();
+ assertThat(request.getText().toString()).isEqualTo(text);
+ }
+
private static TextClassification.Request.Builder createTextClassificationRequestBuilder() {
return new TextClassification.Request.Builder(TEXT, START_INDEX, END_INDEX)
.setDefaultLocales(LOCALE_LIST)
@@ -260,7 +287,7 @@
private TextClassification.Builder createExpectedBuilder() {
TextClassification.Builder builder = new TextClassification.Builder()
- .setText(TEXT.toString())
+ .setText(TEXT)
.setEntityType(TextClassifier.TYPE_ADDRESS, ADDRESS_SCORE)
.setEntityType(TextClassifier.TYPE_PHONE, PHONE_SCORE)
.setId(ID);
diff --git a/textclassifier/src/androidTest/java/androidx/textclassifier/TextSelectionTest.java b/textclassifier/src/androidTest/java/androidx/textclassifier/TextSelectionTest.java
index 2a92aa6..5f66ee1 100644
--- a/textclassifier/src/androidTest/java/androidx/textclassifier/TextSelectionTest.java
+++ b/textclassifier/src/androidTest/java/androidx/textclassifier/TextSelectionTest.java
@@ -38,7 +38,7 @@
public final class TextSelectionTest {
private static final float EPSILON = 1e-7f;
- private static final CharSequence TEXT = "This is an apple";
+ private static final String TEXT = "This is an apple";
private static final int START_INDEX = 2;
private static final int END_INDEX = 5;
private static final String ID = "id";
@@ -114,7 +114,7 @@
assertThat(platformRequest.getStartIndex()).isEqualTo(START_INDEX);
assertThat(platformRequest.getEndIndex()).isEqualTo(END_INDEX);
- assertThat(platformRequest.getText()).isEqualTo(TEXT);
+ assertThat(platformRequest.getText().toString()).isEqualTo(TEXT);
assertThat(platformRequest.getDefaultLocales().toLanguageTags())
.isEqualTo(LOCALE_LIST.toLanguageTags());
}
@@ -131,7 +131,7 @@
TextSelection.Request request = TextSelection.Request.fromPlatfrom(platformRequest);
assertThat(request.getStartIndex()).isEqualTo(START_INDEX);
assertThat(request.getEndIndex()).isEqualTo(END_INDEX);
- assertThat(request.getText()).isEqualTo(TEXT);
+ assertThat(request.getText().toString()).isEqualTo(TEXT);
assertThat(request.getDefaultLocales().toLanguageTags())
.isEqualTo(LOCALE_LIST.toLanguageTags());
}
diff --git a/textclassifier/src/main/java/androidx/textclassifier/ConvertUtils.java b/textclassifier/src/main/java/androidx/textclassifier/ConvertUtils.java
index 3b07118..910ddf34 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/ConvertUtils.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/ConvertUtils.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
@@ -87,7 +86,6 @@
@NonNull
@RequiresApi(28)
- @SuppressLint("RestrictedApi")
static Map<String, Float> createFloatMapFromTextLinks(
@NonNull android.view.textclassifier.TextLinks.TextLink textLink) {
Preconditions.checkNotNull(textLink);
diff --git a/textclassifier/src/main/java/androidx/textclassifier/EntityConfidence.java b/textclassifier/src/main/java/androidx/textclassifier/EntityConfidence.java
index 71ca580..d442c82 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/EntityConfidence.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/EntityConfidence.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import androidx.annotation.FloatRange;
import androidx.annotation.NonNull;
@@ -50,7 +49,6 @@
* @param source a map from entity to a confidence value in the range 0 (low confidence) to
* 1 (high confidence).
*/
- @SuppressLint("RestrictedApi")
EntityConfidence(@NonNull Map<String, Float> source) {
Preconditions.checkNotNull(source);
diff --git a/textclassifier/src/main/java/androidx/textclassifier/LegacyTextClassifier.java b/textclassifier/src/main/java/androidx/textclassifier/LegacyTextClassifier.java
index e59fd27d..387b8b9 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/LegacyTextClassifier.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/LegacyTextClassifier.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -74,7 +73,6 @@
private final MatchMaker mMatchMaker;
@VisibleForTesting()
- @SuppressLint("RestrictedApi")
LegacyTextClassifier(MatchMaker matchMaker) {
mMatchMaker = Preconditions.checkNotNull(matchMaker);
}
@@ -190,7 +188,6 @@
createPermissionsChecker(context));
}
- @SuppressLint("RestrictedApi")
MatchMakerImpl(
Context context,
PackageManager packageManager,
@@ -332,7 +329,6 @@
}
@Nullable
- @SuppressLint("RestrictedApi")
private RemoteActionCompat createRemoteAction(
Intent intent, String title, String description, int requestCode) {
final ResolveInfo resolveInfo = mPackageManager.resolveActivity(intent, 0);
diff --git a/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifier.java b/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifier.java
index 45eb069..9779cac 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifier.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifier.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.os.LocaleList;
@@ -40,7 +39,6 @@
private final androidx.textclassifier.TextClassifier mTextClassifier;
private final Context mContext;
- @SuppressLint("RestrictedApi")
PlatformTextClassifier(
@NonNull Context context,
@NonNull androidx.textclassifier.TextClassifier textClassifier) {
diff --git a/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifierWrapper.java b/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifierWrapper.java
index a3d46b7..c8ef185 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifierWrapper.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/PlatformTextClassifierWrapper.java
@@ -35,7 +35,6 @@
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
@RequiresApi(Build.VERSION_CODES.O)
-@SuppressLint("RestrictedApi")
public class PlatformTextClassifierWrapper extends TextClassifier {
private final android.view.textclassifier.TextClassifier mPlatformTextClassifier;
private final Context mContext;
@@ -69,7 +68,6 @@
@WorkerThread
@Override
// TODO https://issuetracker.google.com/issues/116776070
- @SuppressLint({"WrongThread", "RestrictedApi"})
public TextSelection suggestSelection(@NonNull TextSelection.Request request) {
Preconditions.checkNotNull(request);
ensureNotOnMainThread();
@@ -114,7 +112,6 @@
@NonNull
@WorkerThread
@Override
- @SuppressLint({"WrongThread", "RestrictedApi"}) // TODO https://issuetracker.google.com/issues/116776070
public TextLinks generateLinks(@NonNull TextLinks.Request request) {
Preconditions.checkNotNull(request);
ensureNotOnMainThread();
diff --git a/textclassifier/src/main/java/androidx/textclassifier/SelectionEvent.java b/textclassifier/src/main/java/androidx/textclassifier/SelectionEvent.java
index cd522c6..4049d6d 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/SelectionEvent.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/SelectionEvent.java
@@ -40,7 +40,7 @@
*
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public final class SelectionEvent {
private static final String EXTRA_ABSOLUTE_START = "extra_absolute_start";
private static final String EXTRA_ABSOLUTE_END = "extra_absolute_end";
@@ -184,7 +184,6 @@
@Nullable
private TextSelection mTextSelection;
- @SuppressLint("RestrictedApi")
/* package */ SelectionEvent(
int start, int end,
@EventType int eventType, @EntityType String entityType,
@@ -309,7 +308,6 @@
* @throws IllegalArgumentException if end is less than start
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static SelectionEvent createSelectionModifiedEvent(int start, int end) {
Preconditions.checkArgument(end >= start, "end cannot be less than start");
return new SelectionEvent(
@@ -329,7 +327,6 @@
* @throws IllegalArgumentException if end is less than start
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static SelectionEvent createSelectionModifiedEvent(
int start, int end, @NonNull TextClassification classification) {
Preconditions.checkArgument(end >= start, "end cannot be less than start");
@@ -357,7 +354,6 @@
* @throws IllegalArgumentException if end is less than start
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static SelectionEvent createSelectionModifiedEvent(
int start, int end, @NonNull TextSelection selection) {
Preconditions.checkArgument(end >= start, "end cannot be less than start");
@@ -383,7 +379,6 @@
* @throws IllegalArgumentException if end is less than start
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static SelectionEvent createSelectionActionEvent(
int start, int end, @SelectionEvent.ActionType int actionType) {
Preconditions.checkArgument(end >= start, "end cannot be less than start");
@@ -408,7 +403,6 @@
* @throws IllegalArgumentException If actionType is not a valid SelectionEvent actionType
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static SelectionEvent createSelectionActionEvent(
int start, int end, @SelectionEvent.ActionType int actionType,
@NonNull TextClassification classification) {
@@ -744,10 +738,10 @@
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
+ @SuppressLint("WrongConstant")
@RequiresApi(28)
@NonNull
// Lint does not know the constants in platform and here are same
- @SuppressLint({"WrongConstant", "RestrictedApi"})
Object toPlatform(@NonNull Context context) {
Preconditions.checkNotNull(context);
@@ -771,7 +765,6 @@
@NonNull
@RequiresApi(28)
- @SuppressLint("RestrictedApi")
private android.view.textclassifier.SelectionEvent toPlatformSelectionModifiedEvent(
@NonNull Context context) {
Preconditions.checkNotNull(context);
@@ -792,8 +785,8 @@
@NonNull
@RequiresApi(28)
+ @SuppressLint("WrongConstant")
// Lint does not know the constants in platform and here are same
- @SuppressLint({"WrongConstant", "RestrictedApi"})
private android.view.textclassifier.SelectionEvent toPlatformSelectionActionEvent(
@NonNull Context context) {
Preconditions.checkNotNull(context);
diff --git a/textclassifier/src/main/java/androidx/textclassifier/SessionStrategy.java b/textclassifier/src/main/java/androidx/textclassifier/SessionStrategy.java
deleted file mode 100644
index 31986d8..0000000
--- a/textclassifier/src/main/java/androidx/textclassifier/SessionStrategy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.textclassifier;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-/**
- * Strategy on session handling in {@link TextClassifier}.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-interface SessionStrategy {
-
- void destroy();
-
- void reportSelectionEvent(@NonNull SelectionEvent event);
-
- boolean isDestroyed();
-
- /**
- * Represents a session-less implementation.
- */
- SessionStrategy NO_OP = new SessionStrategy() {
- /**
- * @see {@link TextClassifier#destroy()}
- */
- @Override
- public void destroy() {
- }
-
- /**
- * @see {@link TextClassifier#isDestroyed()} ()}
- */
- @Override
- public boolean isDestroyed() {
- return false;
- }
-
- /**
- * @see {@link TextClassifier#reportSelectionEvent(SelectionEvent)} ()}
- */
- @Override
- public void reportSelectionEvent(@NonNull SelectionEvent event) {
- }
- };
-}
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextClassification.java b/textclassifier/src/main/java/androidx/textclassifier/TextClassification.java
index 21602e6..4c4e197 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextClassification.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextClassification.java
@@ -21,8 +21,11 @@
import android.app.RemoteAction;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -70,6 +73,8 @@
*/
public final class TextClassification {
+ private static final String LOG_TAG = "TextClassification";
+
private static final String EXTRA_TEXT = "text";
private static final String EXTRA_ACTIONS = "actions";
private static final String EXTRA_ENTITY_CONFIDENCE = "entity_conf";
@@ -222,7 +227,6 @@
@RequiresApi(26)
@SuppressWarnings("deprecation") // To support O
@NonNull
- @SuppressLint("RestrictedApi")
static TextClassification fromPlatform(
@NonNull Context context,
@NonNull android.view.textclassifier.TextClassification textClassification) {
@@ -290,9 +294,9 @@
* @hide
*/
// Lint does not know @EntityType in platform and here are same.
- @SuppressLint({"WrongConstant", "RestrictedApi"})
@SuppressWarnings("deprecation") // To support O
@RestrictTo(RestrictTo.Scope.LIBRARY)
+ @SuppressLint("WrongConstant")
@RequiresApi(26)
@NonNull
Object toPlatform(@NonNull Context context) {
@@ -391,7 +395,6 @@
* first.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public Builder addAction(@NonNull RemoteActionCompat action) {
Preconditions.checkArgument(action != null);
mActions.add(action);
@@ -565,7 +568,6 @@
* @param startIndex start index of the text to classify
* @param endIndex end index of the text to classify
*/
- @SuppressLint("RestrictedApi")
public Builder(
@NonNull CharSequence text,
@IntRange(from = 0) int startIndex,
@@ -625,9 +627,36 @@
*/
@NonNull
public Request build() {
- return new Request(mText, mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime,
+ return new Request(
+ normalizeIfUri(mText, mStartIndex, mEndIndex),
+ mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime,
mExtras == null ? Bundle.EMPTY : BundleUtils.deepCopy(mExtras));
}
+
+ // Ensures the package manager can recognize a url scheme that is not all lowercase.
+ // b/123640937
+ @Nullable
+ private static CharSequence normalizeIfUri(
+ CharSequence text, int startIndex, int endIndex) {
+ try {
+ // TODO: Skip if running Android Q.
+ final Uri uri = Uri.parse(text.subSequence(startIndex, endIndex).toString());
+ final String scheme = uri.getScheme();
+ final String lower = scheme == null ? null : scheme.toLowerCase(Locale.ROOT);
+ if (lower != null && !scheme.equals(lower)) {
+ final String normalized = uri.buildUpon().scheme(lower).build().toString();
+ if (normalized.length() == (endIndex - startIndex)) {
+ return new SpannableString(
+ new SpannableStringBuilder(text)
+ .replace(startIndex, endIndex, normalized));
+ }
+ }
+ } catch (Exception e) {
+ // Catching to ensure no crashes from this method.
+ Log.e(LOG_TAG, "Error fixing uri scheme", e);
+ }
+ return text;
+ }
}
/**
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextClassificationContext.java b/textclassifier/src/main/java/androidx/textclassifier/TextClassificationContext.java
index fce79de..61622ae 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextClassificationContext.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextClassificationContext.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.annotation.NonNull;
@@ -40,7 +39,6 @@
private final String mWidgetType;
@Nullable private final String mWidgetVersion;
- @SuppressLint("RestrictedApi")
TextClassificationContext(
String packageName,
String widgetType,
@@ -102,7 +100,6 @@
*
* @return this builder
*/
- @SuppressLint("RestrictedApi")
public Builder(@NonNull String packageName, @NonNull @WidgetType String widgetType) {
mPackageName = Preconditions.checkNotNull(packageName);
mWidgetType = Preconditions.checkNotNull(widgetType);
@@ -147,7 +144,6 @@
* {@link #toBundle()}.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static TextClassificationContext createFromBundle(@NonNull Bundle bundle) {
Preconditions.checkNotNull(bundle);
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextClassificationManager.java b/textclassifier/src/main/java/androidx/textclassifier/TextClassificationManager.java
index c07bcda..7881195 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextClassificationManager.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextClassificationManager.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
@@ -50,7 +49,6 @@
/** @hide **/
@RestrictTo(RestrictTo.Scope.LIBRARY)
@VisibleForTesting
- @SuppressLint("RestrictedApi")
TextClassificationManager(@NonNull Context context) {
mContext = Preconditions.checkNotNull(context);
mDefaultTextClassifier = defaultTextClassifier(context);
@@ -60,7 +58,6 @@
* Returns an instance of {@link TextClassificationManager} for the specified context.
* Each context has its own {@link TextClassificationManager}.
*/
- @SuppressLint("RestrictedApi")
public static TextClassificationManager of(@NonNull Context context) {
Preconditions.checkNotNull(context);
TextClassificationManager textClassificationManager = null;
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextClassificationSessionId.java b/textclassifier/src/main/java/androidx/textclassifier/TextClassificationSessionId.java
index 59ad156..c2de5fd 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextClassificationSessionId.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextClassificationSessionId.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.annotation.NonNull;
@@ -128,7 +127,6 @@
* {@link #toBundle()}.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public static TextClassificationSessionId createFromBundle(@NonNull Bundle bundle) {
Preconditions.checkNotNull(bundle);
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextClassifier.java b/textclassifier/src/main/java/androidx/textclassifier/TextClassifier.java
index d615ccd..0c4e828 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextClassifier.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextClassifier.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Looper;
@@ -79,7 +78,7 @@
public static final String TYPE_FLIGHT_NUMBER = "flight";
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@StringDef(value = {
TYPE_UNKNOWN,
@@ -155,7 +154,6 @@
*/
@WorkerThread
@NonNull
- @SuppressLint("RestrictedApi")
public TextSelection suggestSelection(@NonNull TextSelection.Request request) {
Preconditions.checkNotNull(request);
ensureNotOnMainThread();
@@ -172,7 +170,6 @@
*/
@WorkerThread
@NonNull
- @SuppressLint("RestrictedApi")
public TextClassification classifyText(@NonNull TextClassification.Request request) {
Preconditions.checkNotNull(request);
ensureNotOnMainThread();
@@ -191,7 +188,6 @@
*/
@WorkerThread
@NonNull
- @SuppressLint("RestrictedApi")
public TextLinks generateLinks(@NonNull TextLinks.Request request) {
Preconditions.checkNotNull(request);
ensureNotOnMainThread();
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextLinks.java b/textclassifier/src/main/java/androidx/textclassifier/TextLinks.java
index 8976999..649bfcd 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextLinks.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextLinks.java
@@ -198,7 +198,6 @@
* @return the status code which indicates the operation is success or not.
*/
@Status
- @SuppressLint("RestrictedApi")
public int apply(
@NonNull Spannable text,
@NonNull TextClassifier textClassifier,
@@ -231,7 +230,6 @@
*/
@VisibleForTesting
@RestrictTo(RestrictTo.Scope.LIBRARY)
- @SuppressLint("RestrictedApi")
TextLink(int start, int end, @NonNull Map<String, Float> entityScores) {
Preconditions.checkNotNull(entityScores);
Preconditions.checkArgument(!entityScores.isEmpty());
@@ -412,7 +410,6 @@
@Nullable private Long mReferenceTime = null;
@Nullable private Bundle mExtras;
- @SuppressLint("RestrictedApi")
public Builder(@NonNull CharSequence text) {
mText = Preconditions.checkNotNull(text);
}
@@ -546,7 +543,6 @@
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
- @SuppressLint("RestrictedApi")
TextLinkSpanData(
@NonNull TextLink textLink,
@NonNull TextClassifier textClassifier,
@@ -589,7 +585,6 @@
public abstract static class TextLinkSpan extends ClickableSpan {
private TextLinkSpanData mTextLinkSpanData;
- @SuppressLint("RestrictedApi")
public TextLinkSpan(@NonNull TextLinkSpanData textLinkSpanData) {
mTextLinkSpanData = Preconditions.checkNotNull(textLinkSpanData);
}
@@ -758,7 +753,6 @@
*
* @param fullText The full text to annotate with links.
*/
- @SuppressLint("RestrictedApi")
public Builder(@NonNull CharSequence fullText) {
mFullText = Preconditions.checkNotNull(fullText);
mLinks = new ArrayList<>();
@@ -772,7 +766,6 @@
* @throws IllegalArgumentException if entityScores is null or empty.
*/
@NonNull
- @SuppressLint("RestrictedApi")
public Builder addLink(int start, int end, @NonNull Map<String, Float> entityScores) {
mLinks.add(new TextLink(start, end, Preconditions.checkNotNull(entityScores)));
return this;
@@ -782,7 +775,6 @@
* @hide
*/
@NonNull
- @SuppressLint("RestrictedApi")
Builder addLink(TextLink link) {
mLinks.add(Preconditions.checkNotNull(link));
return this;
@@ -823,7 +815,6 @@
@RestrictTo(RestrictTo.Scope.LIBRARY)
@RequiresApi(28)
@NonNull
- @SuppressLint("RestrictedApi")
// TODO: In Q, we should make getText public and use it here.
static TextLinks fromPlatform(
@NonNull android.view.textclassifier.TextLinks textLinks,
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextLinksParams.java b/textclassifier/src/main/java/androidx/textclassifier/TextLinksParams.java
index 71f85e1..b673c28 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextLinksParams.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextLinksParams.java
@@ -16,7 +16,6 @@
package androidx.textclassifier;
-import android.annotation.SuppressLint;
import android.text.Spannable;
import android.text.style.ClickableSpan;
@@ -102,7 +101,6 @@
* @return a status code indicating whether or not the links were successfully applied
*/
@TextLinks.Status
- @SuppressLint("RestrictedApi")
int apply(@NonNull Spannable text,
@NonNull TextLinks textLinks,
@NonNull TextClassifier textClassifier) {
diff --git a/textclassifier/src/main/java/androidx/textclassifier/TextSelection.java b/textclassifier/src/main/java/androidx/textclassifier/TextSelection.java
index 94bcef6..6e66b71 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/TextSelection.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/TextSelection.java
@@ -175,7 +175,6 @@
@RestrictTo(RestrictTo.Scope.LIBRARY)
@RequiresApi(26)
@NonNull
- @SuppressLint("RestrictedApi")
static TextSelection fromPlatform(
@NonNull android.view.textclassifier.TextSelection textSelection) {
Preconditions.checkNotNull(textSelection);
@@ -237,7 +236,6 @@
* @param startIndex the start index of the text selection.
* @param endIndex the end index of the text selection. Must be greater than startIndex
*/
- @SuppressLint("RestrictedApi")
public Builder(@IntRange(from = 0) int startIndex, @IntRange(from = 0) int endIndex) {
Preconditions.checkArgument(startIndex >= 0);
Preconditions.checkArgument(endIndex > startIndex);
@@ -411,7 +409,6 @@
* @param startIndex start index of the selected part of text
* @param endIndex end index of the selected part of text
*/
- @SuppressLint("RestrictedApi")
public Builder(
@NonNull CharSequence text,
@IntRange(from = 0) int startIndex,
diff --git a/textclassifier/src/main/java/androidx/textclassifier/widget/FloatingToolbar.java b/textclassifier/src/main/java/androidx/textclassifier/widget/FloatingToolbar.java
index 98ea3ed..a7e4b38 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/widget/FloatingToolbar.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/widget/FloatingToolbar.java
@@ -16,13 +16,12 @@
package androidx.textclassifier.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.res.TypedArray;
@@ -85,7 +84,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(Build.VERSION_CODES.M)
final class FloatingToolbar {
@@ -185,7 +184,6 @@
/**
* Initializes a floating toolbar.
*/
- @SuppressLint("RestrictedApi")
FloatingToolbar(View view) {
// TODO(b/65172902): Pass context in constructor when DecorView (and other callers)
// supports multi-display.
@@ -205,7 +203,6 @@
* NOTE: Call {@link #updateLayout()} or {@link #show()} to effect visual changes to the
* toolbar.
*/
- @SuppressLint("RestrictedApi")
public void setMenu(SupportMenu menu) {
mMenu = Preconditions.checkNotNull(menu);
}
@@ -236,7 +233,6 @@
* NOTE: Call {@link #updateLayout()} or {@link #show()} to effect visual changes to the
* toolbar.
*/
- @SuppressLint("RestrictedApi")
public void setContentRect(Rect rect) {
mContentRect.set(Preconditions.checkNotNull(rect));
}
@@ -506,7 +502,6 @@
* @param parent A parent view to get the {@link android.view.View#getWindowToken()} token
* from.
*/
- @SuppressLint("RestrictedApi")
FloatingToolbarPopup(
Context context, View parent, Runnable dismissRunnable) {
mParent = Preconditions.checkNotNull(parent);
@@ -630,7 +625,6 @@
* Shows this popup at the specified coordinates.
* The specified coordinates may be adjusted to make sure the popup is entirely on-screen.
*/
- @SuppressLint("RestrictedApi")
public void show(Rect contentRectOnScreen) {
Preconditions.checkNotNull(contentRectOnScreen);
@@ -700,7 +694,6 @@
* The specified coordinates may be adjusted to make sure the popup is entirely on-screen.
* This is a no-op if this popup is not showing.
*/
- @SuppressLint("RestrictedApi")
void updateCoordinates(Rect contentRectOnScreen) {
Preconditions.checkNotNull(contentRectOnScreen);
@@ -1189,7 +1182,6 @@
*
* @return The menu items that are not included in this main panel.
*/
- @SuppressLint("RestrictedApi")
List<SupportMenuItem> layoutMainPanelItems(
List<SupportMenuItem> menuItems, final int toolbarWidth) {
Preconditions.checkNotNull(menuItems);
@@ -1537,7 +1529,6 @@
return listener;
}
- @SuppressLint("RestrictedApi")
private static Size measure(View view) {
Preconditions.checkState(view.getParent() == null);
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
@@ -1592,7 +1583,6 @@
private final FloatingToolbarPopup mPopup;
- @SuppressLint("RestrictedApi")
OverflowPanel(FloatingToolbarPopup popup) {
super(Preconditions.checkNotNull(popup).mContext);
this.mPopup = popup;
@@ -1654,7 +1644,6 @@
private final Context mContext;
- @SuppressLint("RestrictedApi")
OverflowPanelViewHelper(Context context, int iconTextSpacing) {
mContext = Preconditions.checkNotNull(context);
mIconTextSpacing = iconTextSpacing;
@@ -1663,7 +1652,6 @@
mCalculator = createMenuButton(null);
}
- @SuppressLint("RestrictedApi")
public View getView(SupportMenuItem menuItem, int minimumWidth, View convertView) {
Preconditions.checkNotNull(menuItem);
if (convertView != null) {
@@ -1807,7 +1795,6 @@
}
// TODO: Replace with SupportMenuItem method when those are implemented.
- @SuppressLint("RestrictedApi")
static boolean requiresOverflow(SupportMenuItem menuItem) {
if (menuItem instanceof MenuItemImpl) {
final MenuItemImpl impl = (MenuItemImpl) menuItem;
@@ -1817,7 +1804,6 @@
}
// TODO: Replace with SupportMenuItem method when those are implemented.
- @SuppressLint("RestrictedApi")
static boolean requiresActionButton(SupportMenuItem menuItem) {
return menuItem instanceof MenuItemImpl
&& ((MenuItemImpl) menuItem).requiresActionButton();
diff --git a/textclassifier/src/main/java/androidx/textclassifier/widget/ToolbarController.java b/textclassifier/src/main/java/androidx/textclassifier/widget/ToolbarController.java
index 204899b..c571eb2 100644
--- a/textclassifier/src/main/java/androidx/textclassifier/widget/ToolbarController.java
+++ b/textclassifier/src/main/java/androidx/textclassifier/widget/ToolbarController.java
@@ -16,9 +16,8 @@
package androidx.textclassifier.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
-import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.content.ClipData;
import android.content.ClipboardManager;
@@ -62,7 +61,7 @@
*
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
@RequiresApi(Build.VERSION_CODES.M)
@UiThread
public final class ToolbarController {
@@ -95,7 +94,6 @@
return sInstance.get();
}
- @SuppressLint("RestrictedApi")
private ToolbarController(TextView textView) {
mTextView = Preconditions.checkNotNull(textView);
mContentRect = new Rect();
@@ -117,7 +115,6 @@
* @param end text end index for positioning the toolbar;
* the toolbar will not be shown this index is invalid for the associated textView
*/
- @SuppressLint("RestrictedApi")
public void show(List<RemoteActionCompat> actions, int start, int end) {
Preconditions.checkNotNull(actions);
Preconditions.checkArgumentInRange(start, 0, end - 1, "start");
@@ -231,7 +228,6 @@
y + textView.getTotalPaddingTop() - textView.getScrollY() + xy[1]};
}
- @SuppressLint("RestrictedApi")
private static SupportMenu createMenu(
final TextView textView,
final BackgroundSpan highlight,
@@ -367,7 +363,6 @@
private int[] mLocation = new int[2];
- @SuppressLint("RestrictedApi")
OnCoordinatesChangeHandler(
FloatingToolbar toolbar, TextView textView, int start, int end) {
mToolbar = Preconditions.checkNotNull(toolbar);
@@ -400,7 +395,6 @@
private final FloatingToolbar mToolbar;
- @SuppressLint("RestrictedApi")
OnWindowFocusChangeListener(FloatingToolbar toolbar) {
mToolbar = Preconditions.checkNotNull(toolbar);
}
@@ -419,7 +413,6 @@
private final TextView mTextView;
private final FloatingToolbar mToolbar;
- @SuppressLint("RestrictedApi")
OnTextViewFocusChangeListener(TextView textView, FloatingToolbar toolbar) {
mTextView = Preconditions.checkNotNull(textView);
mToolbar = Preconditions.checkNotNull(toolbar);
@@ -438,7 +431,6 @@
private final FloatingToolbar mToolbar;
- @SuppressLint("RestrictedApi")
OnTextViewDetachedListener(FloatingToolbar toolbar) {
mToolbar = Preconditions.checkNotNull(toolbar);
}
@@ -461,7 +453,6 @@
@Nullable final ActionMode.Callback mOriginalCallback;
private final boolean mPreferMe;
- @SuppressLint("RestrictedApi")
ActionModeCallback(
FloatingToolbar toolbar,
@Nullable ActionMode.Callback originalCallback,
@@ -532,7 +523,6 @@
private final ActionModeCallback mSelectionCallback;
private final ActionModeCallback mInsertionCallback;
- @SuppressLint("RestrictedApi")
OnToolbarDismissListener(
TextView textView,
OnCoordinatesChangeHandler onCoordinatesChangeHandler,
@@ -573,7 +563,6 @@
private final FloatingToolbar mToolbar;
- @SuppressLint("RestrictedApi")
OnMenuItemClickListener(FloatingToolbar toolbar) {
mToolbar = Preconditions.checkNotNull(toolbar);
}
diff --git a/transition/build.gradle b/transition/build.gradle
index a954e0d..082bb93 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -7,7 +7,7 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.0")
+ api(project(":annotation"))
api(project(":core"))
implementation(project(":collection"))
compileOnly project(':fragment')
diff --git a/transition/src/androidTest/java/androidx/transition/ExplodeTest.java b/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
index d402a8b..246b832 100644
--- a/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
@@ -36,8 +36,11 @@
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
import org.mockito.verification.VerificationMode;
+@Ignore("Temporarily disabled due to b/112005299")
@LargeTest
public class ExplodeTest extends BaseTransitionTest {
@@ -80,8 +83,7 @@
});
}
- // Temporarily disabled due to b/118137165.
- // @Test
+ @Test
public void testExplode() throws Throwable {
rule.runOnUiThread(new Runnable() {
@Override
@@ -115,8 +117,7 @@
assertEquals(View.INVISIBLE, mYellowSquare.getVisibility());
}
- // Temporarily disabled due to b/112005299.
- // @Test
+ @Test
public void testImplode() throws Throwable {
rule.runOnUiThread(new Runnable() {
@Override
diff --git a/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java b/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java
index 5a71f218..41c3e69 100644
--- a/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java
+++ b/transition/src/main/java/androidx/transition/FragmentTransitionSupport.java
@@ -16,7 +16,7 @@
package androidx.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
import android.view.View;
@@ -35,7 +35,7 @@
*/
// This is instantiated in androidx.fragment.app.FragmentTransition
@SuppressWarnings("unused")
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class FragmentTransitionSupport extends FragmentTransitionImpl {
@Override
diff --git a/transition/src/main/java/androidx/transition/Slide.java b/transition/src/main/java/androidx/transition/Slide.java
index 8eb67ca..f4458a2 100644
--- a/transition/src/main/java/androidx/transition/Slide.java
+++ b/transition/src/main/java/androidx/transition/Slide.java
@@ -16,7 +16,7 @@
package androidx.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.TimeInterpolator;
@@ -58,7 +58,7 @@
private int mSlideEdge = Gravity.BOTTOM;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(RetentionPolicy.SOURCE)
@IntDef({Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM, Gravity.START, Gravity.END})
public @interface GravityFlag {
diff --git a/transition/src/main/java/androidx/transition/Transition.java b/transition/src/main/java/androidx/transition/Transition.java
index 17e1568..285570e 100644
--- a/transition/src/main/java/androidx/transition/Transition.java
+++ b/transition/src/main/java/androidx/transition/Transition.java
@@ -16,7 +16,7 @@
package androidx.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -149,7 +149,7 @@
private static final int MATCH_LAST = MATCH_ITEM_ID;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@IntDef({MATCH_INSTANCE, MATCH_NAME, MATCH_ID, MATCH_ITEM_ID})
@Retention(RetentionPolicy.SOURCE)
public @interface MatchOrder {
@@ -697,7 +697,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList,
ArrayList<TransitionValues> endValuesList) {
@@ -867,7 +867,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void runAnimators() {
if (DBG) {
Log.d(LOG_TAG, "runAnimators() on " + this);
@@ -1710,7 +1710,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void pause(View sceneRoot) {
if (!mEnded) {
ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
@@ -1742,7 +1742,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public void resume(View sceneRoot) {
if (mPaused) {
if (!mEnded) {
@@ -1889,7 +1889,7 @@
* @param animator The Animator to be run during this transition.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void animate(Animator animator) {
// TODO: maybe pass auto-end as a boolean parameter?
if (animator == null) {
@@ -1922,7 +1922,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void start() {
if (mNumInstances == 0) {
if (mListeners != null && mListeners.size() > 0) {
@@ -1949,7 +1949,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void end() {
--mNumInstances;
if (mNumInstances == 0) {
@@ -1982,7 +1982,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void forceToEnd(ViewGroup sceneRoot) {
ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
int numOldAnims = runningAnimators.size();
@@ -2003,7 +2003,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void cancel() {
int numAnimators = mCurrentAnimators.size();
for (int i = numAnimators - 1; i >= 0; i--) {
diff --git a/transition/src/main/java/androidx/transition/TransitionSet.java b/transition/src/main/java/androidx/transition/TransitionSet.java
index 46377df..d82b832 100644
--- a/transition/src/main/java/androidx/transition/TransitionSet.java
+++ b/transition/src/main/java/androidx/transition/TransitionSet.java
@@ -16,7 +16,7 @@
package androidx.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.TimeInterpolator;
import android.content.Context;
@@ -455,7 +455,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList,
@@ -482,7 +482,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void runAnimators() {
if (mTransitions.isEmpty()) {
@@ -550,7 +550,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void pause(View sceneRoot) {
super.pause(sceneRoot);
@@ -561,7 +561,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public void resume(View sceneRoot) {
super.resume(sceneRoot);
@@ -572,7 +572,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
protected void cancel() {
super.cancel();
@@ -583,7 +583,7 @@
}
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
void forceToEnd(ViewGroup sceneRoot) {
super.forceToEnd(sceneRoot);
diff --git a/transition/src/main/java/androidx/transition/ViewOverlayApi14.java b/transition/src/main/java/androidx/transition/ViewOverlayApi14.java
index cf64ee2..bfffddb 100644
--- a/transition/src/main/java/androidx/transition/ViewOverlayApi14.java
+++ b/transition/src/main/java/androidx/transition/ViewOverlayApi14.java
@@ -16,7 +16,7 @@
package androidx.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.Context;
import android.graphics.Canvas;
@@ -265,7 +265,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected ViewParent invalidateChildInParentFast(int left, int top, Rect dirty) {
if (mHostView instanceof ViewGroup && sInvalidateChildInParentFastMethod != null) {
try {
diff --git a/transition/src/main/java/androidx/transition/Visibility.java b/transition/src/main/java/androidx/transition/Visibility.java
index da4ef95..c27d93e 100644
--- a/transition/src/main/java/androidx/transition/Visibility.java
+++ b/transition/src/main/java/androidx/transition/Visibility.java
@@ -16,7 +16,7 @@
package androidx.transition;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -71,7 +71,7 @@
public static final int MODE_OUT = 0x2;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressLint("UniqueConstants") // because MODE_IN and Fade.IN are aliases.
@IntDef(flag = true, value = {MODE_IN, MODE_OUT, Fade.IN, Fade.OUT})
@Retention(RetentionPolicy.SOURCE)
diff --git a/tv-provider/api/1.1.0-alpha01.txt b/tv-provider/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..a3dc91d
--- /dev/null
+++ b/tv-provider/api/1.1.0-alpha01.txt
@@ -0,0 +1,736 @@
+// Signature format: 3.0
+package androidx.tvprovider.media.tv {
+
+ public final class Channel {
+ method public static androidx.tvprovider.media.tv.Channel! fromCursor(android.database.Cursor!);
+ method public int getAppLinkColor();
+ method public android.net.Uri! getAppLinkIconUri();
+ method public android.content.Intent! getAppLinkIntent() throws java.net.URISyntaxException;
+ method public android.net.Uri! getAppLinkIntentUri();
+ method public android.net.Uri! getAppLinkPosterArtUri();
+ method public String! getAppLinkText();
+ method public int getConfigurationDisplayOrder();
+ method public String! getDescription();
+ method public String! getDisplayName();
+ method public String! getDisplayNumber();
+ method public long getId();
+ method public String! getInputId();
+ method public byte[]! getInternalProviderDataByteArray();
+ method public Long! getInternalProviderFlag1();
+ method public Long! getInternalProviderFlag2();
+ method public Long! getInternalProviderFlag3();
+ method public Long! getInternalProviderFlag4();
+ method public String! getInternalProviderId();
+ method public String! getNetworkAffiliation();
+ method public int getOriginalNetworkId();
+ method public String! getPackageName();
+ method public int getServiceId();
+ method public String! getServiceType();
+ method public String! getSystemChannelKey();
+ method public int getTransportStreamId();
+ method public String! getType();
+ method public String! getVideoFormat();
+ method public boolean isBrowsable();
+ method public boolean isLocked();
+ method public boolean isSearchable();
+ method public boolean isTransient();
+ method public android.content.ContentValues! toContentValues();
+ }
+
+ public static final class Channel.Builder {
+ ctor public Channel.Builder();
+ ctor public Channel.Builder(androidx.tvprovider.media.tv.Channel!);
+ method public androidx.tvprovider.media.tv.Channel! build();
+ method public androidx.tvprovider.media.tv.Channel.Builder! setAppLinkColor(int);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setAppLinkIconUri(android.net.Uri!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setAppLinkIntent(android.content.Intent!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setAppLinkIntentUri(android.net.Uri!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setAppLinkPosterArtUri(android.net.Uri!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setAppLinkText(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setConfigurationDisplayOrder(int);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setDescription(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setDisplayName(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setDisplayNumber(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInputId(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderData(byte[]!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderData(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderFlag1(long);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderFlag2(long);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderFlag3(long);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderFlag4(long);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setInternalProviderId(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setNetworkAffiliation(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setOriginalNetworkId(int);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setSearchable(boolean);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setServiceId(int);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setServiceType(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setSystemChannelKey(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setTransient(boolean);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setTransportStreamId(int);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setType(String!);
+ method public androidx.tvprovider.media.tv.Channel.Builder! setVideoFormat(String!);
+ }
+
+ @WorkerThread public class ChannelLogoUtils {
+ ctor @Deprecated public ChannelLogoUtils();
+ method @WorkerThread public static android.graphics.Bitmap! loadChannelLogo(android.content.Context, long);
+ method public static boolean storeChannelLogo(android.content.Context, long, android.net.Uri);
+ method @WorkerThread public static boolean storeChannelLogo(android.content.Context, long, android.graphics.Bitmap);
+ }
+
+ public class PreviewChannel {
+ method public static androidx.tvprovider.media.tv.PreviewChannel! fromCursor(android.database.Cursor!);
+ method public android.content.Intent! getAppLinkIntent() throws java.net.URISyntaxException;
+ method public android.net.Uri! getAppLinkIntentUri();
+ method public CharSequence! getDescription();
+ method public CharSequence! getDisplayName();
+ method public long getId();
+ method public byte[]! getInternalProviderDataByteArray();
+ method public Long! getInternalProviderFlag1();
+ method public Long! getInternalProviderFlag2();
+ method public Long! getInternalProviderFlag3();
+ method public Long! getInternalProviderFlag4();
+ method public String! getInternalProviderId();
+ method @WorkerThread public android.graphics.Bitmap! getLogo(android.content.Context!);
+ method public String! getPackageName();
+ method public String! getType();
+ method public boolean hasAnyUpdatedValues(androidx.tvprovider.media.tv.PreviewChannel!);
+ method public boolean isBrowsable();
+ }
+
+ public static final class PreviewChannel.Builder {
+ ctor public PreviewChannel.Builder();
+ ctor public PreviewChannel.Builder(androidx.tvprovider.media.tv.PreviewChannel!);
+ method public androidx.tvprovider.media.tv.PreviewChannel! build();
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setAppLinkIntent(android.content.Intent!);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setAppLinkIntentUri(android.net.Uri!);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setDescription(CharSequence!);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setDisplayName(CharSequence!);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setInternalProviderData(byte[]!);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setInternalProviderFlag1(long);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setInternalProviderFlag2(long);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setInternalProviderFlag3(long);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setInternalProviderFlag4(long);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setInternalProviderId(String!);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setLogo(android.graphics.Bitmap);
+ method public androidx.tvprovider.media.tv.PreviewChannel.Builder! setLogo(android.net.Uri);
+ }
+
+ @WorkerThread public class PreviewChannelHelper {
+ ctor public PreviewChannelHelper(android.content.Context!);
+ ctor public PreviewChannelHelper(android.content.Context!, int, int);
+ method public void deletePreviewChannel(long);
+ method public void deletePreviewProgram(long);
+ method protected android.graphics.Bitmap! downloadBitmap(android.net.Uri) throws java.io.IOException;
+ method public java.util.List<androidx.tvprovider.media.tv.PreviewChannel>! getAllChannels();
+ method public androidx.tvprovider.media.tv.PreviewChannel! getPreviewChannel(long);
+ method public androidx.tvprovider.media.tv.PreviewProgram! getPreviewProgram(long);
+ method public androidx.tvprovider.media.tv.WatchNextProgram! getWatchNextProgram(long);
+ method public long publishChannel(androidx.tvprovider.media.tv.PreviewChannel) throws java.io.IOException;
+ method public long publishDefaultChannel(androidx.tvprovider.media.tv.PreviewChannel) throws java.io.IOException;
+ method public long publishPreviewProgram(androidx.tvprovider.media.tv.PreviewProgram);
+ method public long publishWatchNextProgram(androidx.tvprovider.media.tv.WatchNextProgram);
+ method public void updatePreviewChannel(long, androidx.tvprovider.media.tv.PreviewChannel) throws java.io.IOException;
+ method public void updatePreviewProgram(long, androidx.tvprovider.media.tv.PreviewProgram);
+ method public void updateWatchNextProgram(androidx.tvprovider.media.tv.WatchNextProgram, long);
+ }
+
+ public final class PreviewProgram {
+ method public static androidx.tvprovider.media.tv.PreviewProgram! fromCursor(android.database.Cursor!);
+ method public String[]! getAudioLanguages();
+ method public String! getAuthor();
+ method public int getAvailability();
+ method public String[]! getCanonicalGenres();
+ method public long getChannelId();
+ method public String! getContentId();
+ method public android.media.tv.TvContentRating[]! getContentRatings();
+ method public String! getDescription();
+ method public int getDurationMillis();
+ method public long getEndTimeUtcMillis();
+ method public String! getEpisodeNumber();
+ method public String! getEpisodeTitle();
+ method public String! getGenre();
+ method public long getId();
+ method public android.content.Intent! getIntent() throws java.net.URISyntaxException;
+ method public android.net.Uri! getIntentUri();
+ method public long getInteractionCount();
+ method public int getInteractionType();
+ method public byte[]! getInternalProviderDataByteArray();
+ method public Long! getInternalProviderFlag1();
+ method public Long! getInternalProviderFlag2();
+ method public Long! getInternalProviderFlag3();
+ method public Long! getInternalProviderFlag4();
+ method public String! getInternalProviderId();
+ method public int getItemCount();
+ method public int getLastPlaybackPositionMillis();
+ method public String! getLogoContentDescription();
+ method public android.net.Uri! getLogoUri();
+ method public String! getLongDescription();
+ method public String! getOfferPrice();
+ method public int getPosterArtAspectRatio();
+ method public android.net.Uri! getPosterArtUri();
+ method public android.net.Uri! getPreviewAudioUri();
+ method public android.net.Uri! getPreviewVideoUri();
+ method public String! getReleaseDate();
+ method public String! getReviewRating();
+ method public int getReviewRatingStyle();
+ method public String! getSeasonNumber();
+ method public String! getSeasonTitle();
+ method public long getStartTimeUtcMillis();
+ method public String! getStartingPrice();
+ method public int getThumbnailAspectRatio();
+ method public android.net.Uri! getThumbnailUri();
+ method public String! getTitle();
+ method public int getTvSeriesItemType();
+ method public int getType();
+ method public int getVideoHeight();
+ method public int getVideoWidth();
+ method public int getWeight();
+ method public boolean hasAnyUpdatedValues(androidx.tvprovider.media.tv.PreviewProgram!);
+ method public boolean isBrowsable();
+ method public boolean isLive();
+ method public boolean isSearchable();
+ method public boolean isTransient();
+ method public android.content.ContentValues! toContentValues();
+ }
+
+ public static final class PreviewProgram.Builder {
+ ctor public PreviewProgram.Builder();
+ ctor public PreviewProgram.Builder(androidx.tvprovider.media.tv.PreviewProgram!);
+ method public androidx.tvprovider.media.tv.PreviewProgram! build();
+ method public androidx.tvprovider.media.tv.PreviewProgram.Builder! setChannelId(long);
+ method public androidx.tvprovider.media.tv.PreviewProgram.Builder! setWeight(int);
+ }
+
+ public final class Program implements java.lang.Comparable<androidx.tvprovider.media.tv.Program> {
+ method public int compareTo(androidx.tvprovider.media.tv.Program);
+ method public static androidx.tvprovider.media.tv.Program! fromCursor(android.database.Cursor!);
+ method public String[]! getAudioLanguages();
+ method public String[]! getBroadcastGenres();
+ method public String[]! getCanonicalGenres();
+ method public long getChannelId();
+ method public android.media.tv.TvContentRating[]! getContentRatings();
+ method public String! getDescription();
+ method public long getEndTimeUtcMillis();
+ method public String! getEpisodeNumber();
+ method public String! getEpisodeTitle();
+ method public long getId();
+ method public byte[]! getInternalProviderDataByteArray();
+ method public Long! getInternalProviderFlag1();
+ method public Long! getInternalProviderFlag2();
+ method public Long! getInternalProviderFlag3();
+ method public Long! getInternalProviderFlag4();
+ method public String! getLongDescription();
+ method public android.net.Uri! getPosterArtUri();
+ method public String! getReviewRating();
+ method public int getReviewRatingStyle();
+ method public String! getSeasonNumber();
+ method public String! getSeasonTitle();
+ method public long getStartTimeUtcMillis();
+ method public android.net.Uri! getThumbnailUri();
+ method public String! getTitle();
+ method public int getVideoHeight();
+ method public int getVideoWidth();
+ method public boolean isRecordingProhibited();
+ method public boolean isSearchable();
+ method public android.content.ContentValues! toContentValues();
+ }
+
+ public static class Program.Builder {
+ ctor public Program.Builder();
+ ctor public Program.Builder(androidx.tvprovider.media.tv.Program!);
+ method public androidx.tvprovider.media.tv.Program! build();
+ method public androidx.tvprovider.media.tv.Program.Builder! setBroadcastGenres(String[]!);
+ method public androidx.tvprovider.media.tv.Program.Builder! setChannelId(long);
+ method public androidx.tvprovider.media.tv.Program.Builder! setEndTimeUtcMillis(long);
+ method public androidx.tvprovider.media.tv.Program.Builder! setRecordingProhibited(boolean);
+ method public androidx.tvprovider.media.tv.Program.Builder! setStartTimeUtcMillis(long);
+ }
+
+ public final class TvContractCompat {
+ method public static android.net.Uri! buildChannelLogoUri(long);
+ method public static android.net.Uri! buildChannelLogoUri(android.net.Uri!);
+ method public static android.net.Uri! buildChannelUri(long);
+ method public static android.net.Uri! buildChannelUriForPassthroughInput(String!);
+ method public static android.net.Uri! buildChannelsUriForInput(String?);
+ method public static String! buildInputId(android.content.ComponentName!);
+ method public static android.net.Uri! buildPreviewProgramUri(long);
+ method public static android.net.Uri! buildPreviewProgramsUriForChannel(long);
+ method public static android.net.Uri! buildPreviewProgramsUriForChannel(android.net.Uri!);
+ method public static android.net.Uri! buildProgramUri(long);
+ method public static android.net.Uri! buildProgramsUriForChannel(long);
+ method public static android.net.Uri! buildProgramsUriForChannel(android.net.Uri!);
+ method public static android.net.Uri! buildProgramsUriForChannel(long, long, long);
+ method public static android.net.Uri! buildProgramsUriForChannel(android.net.Uri!, long, long);
+ method public static android.net.Uri! buildRecordedProgramUri(long);
+ method public static android.net.Uri! buildWatchNextProgramUri(long);
+ method public static boolean isChannelUri(android.net.Uri!);
+ method public static boolean isChannelUriForPassthroughInput(android.net.Uri!);
+ method public static boolean isChannelUriForTunerInput(android.net.Uri!);
+ method public static boolean isProgramUri(android.net.Uri!);
+ method public static boolean isRecordedProgramUri(android.net.Uri!);
+ method public static void requestChannelBrowsable(android.content.Context!, long);
+ field public static final String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
+ field public static final String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
+ field public static final String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
+ field public static final String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
+ field public static final String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
+ field public static final String AUTHORITY = "android.media.tv";
+ field public static final String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
+ field public static final String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
+ field public static final String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
+ }
+
+ public static interface TvContractCompat.BaseTvColumns extends android.provider.BaseColumns {
+ field public static final String COLUMN_PACKAGE_NAME = "package_name";
+ }
+
+ public static final class TvContractCompat.Channels implements androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns {
+ method public static String? getVideoResolution(String!);
+ field public static final String COLUMN_APP_LINK_COLOR = "app_link_color";
+ field public static final String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
+ field public static final String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
+ field public static final String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
+ field public static final String COLUMN_APP_LINK_TEXT = "app_link_text";
+ field public static final String COLUMN_BROWSABLE = "browsable";
+ field public static final String COLUMN_CONFIGURATION_DISPLAY_ORDER = "configuration_display_order";
+ field public static final String COLUMN_DESCRIPTION = "description";
+ field public static final String COLUMN_DISPLAY_NAME = "display_name";
+ field public static final String COLUMN_DISPLAY_NUMBER = "display_number";
+ field public static final String COLUMN_INPUT_ID = "input_id";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+ field public static final String COLUMN_LOCKED = "locked";
+ field public static final String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
+ field public static final String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SERVICE_ID = "service_id";
+ field public static final String COLUMN_SERVICE_TYPE = "service_type";
+ field public static final String COLUMN_SYSTEM_CHANNEL_KEY = "system_channel_key";
+ field public static final String COLUMN_TRANSIENT = "transient";
+ field public static final String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
+ field public static final String COLUMN_TYPE = "type";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_FORMAT = "video_format";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
+ field public static final android.net.Uri! CONTENT_URI;
+ field public static final String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
+ field public static final String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
+ field public static final String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
+ field public static final String TYPE_1SEG = "TYPE_1SEG";
+ field public static final String TYPE_ATSC_C = "TYPE_ATSC_C";
+ field public static final String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
+ field public static final String TYPE_ATSC_T = "TYPE_ATSC_T";
+ field public static final String TYPE_CMMB = "TYPE_CMMB";
+ field public static final String TYPE_DTMB = "TYPE_DTMB";
+ field public static final String TYPE_DVB_C = "TYPE_DVB_C";
+ field public static final String TYPE_DVB_C2 = "TYPE_DVB_C2";
+ field public static final String TYPE_DVB_H = "TYPE_DVB_H";
+ field public static final String TYPE_DVB_S = "TYPE_DVB_S";
+ field public static final String TYPE_DVB_S2 = "TYPE_DVB_S2";
+ field public static final String TYPE_DVB_SH = "TYPE_DVB_SH";
+ field public static final String TYPE_DVB_T = "TYPE_DVB_T";
+ field public static final String TYPE_DVB_T2 = "TYPE_DVB_T2";
+ field public static final String TYPE_ISDB_C = "TYPE_ISDB_C";
+ field public static final String TYPE_ISDB_S = "TYPE_ISDB_S";
+ field public static final String TYPE_ISDB_T = "TYPE_ISDB_T";
+ field public static final String TYPE_ISDB_TB = "TYPE_ISDB_TB";
+ field public static final String TYPE_NTSC = "TYPE_NTSC";
+ field public static final String TYPE_OTHER = "TYPE_OTHER";
+ field public static final String TYPE_PAL = "TYPE_PAL";
+ field public static final String TYPE_PREVIEW = "TYPE_PREVIEW";
+ field public static final String TYPE_SECAM = "TYPE_SECAM";
+ field public static final String TYPE_S_DMB = "TYPE_S_DMB";
+ field public static final String TYPE_T_DMB = "TYPE_T_DMB";
+ field public static final String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
+ field public static final String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
+ field public static final String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
+ field public static final String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
+ field public static final String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
+ field public static final String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
+ field public static final String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
+ field public static final String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
+ field public static final String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
+ field public static final String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
+ field public static final String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
+ field public static final String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
+ field public static final String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
+ field public static final String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
+ field public static final String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
+ field public static final String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
+ }
+
+ public static final class TvContractCompat.Channels.Logo {
+ field public static final String CONTENT_DIRECTORY = "logo";
+ }
+
+ public static final class TvContractCompat.PreviewPrograms implements androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns {
+ field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+ field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+ field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+ field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+ field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+ field public static final int ASPECT_RATIO_MOVIE_POSTER = 5; // 0x5
+ field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+ field public static final int AVAILABILITY_FREE = 4; // 0x4
+ field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+ field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+ field public static final int AVAILABILITY_PURCHASED = 3; // 0x3
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_AUTHOR = "author";
+ field public static final String COLUMN_AVAILABILITY = "availability";
+ field public static final String COLUMN_BROWSABLE = "browsable";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_CONTENT_ID = "content_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_DURATION_MILLIS = "duration_millis";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_GENRE = "genre";
+ field public static final String COLUMN_INTENT_URI = "intent_uri";
+ field public static final String COLUMN_INTERACTION_COUNT = "interaction_count";
+ field public static final String COLUMN_INTERACTION_TYPE = "interaction_type";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+ field public static final String COLUMN_ITEM_COUNT = "item_count";
+ field public static final String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+ field public static final String COLUMN_LIVE = "live";
+ field public static final String COLUMN_LOGO_CONTENT_DESCRIPTION = "logo_content_description";
+ field public static final String COLUMN_LOGO_URI = "logo_uri";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_OFFER_PRICE = "offer_price";
+ field public static final String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_PREVIEW_AUDIO_URI = "preview_audio_uri";
+ field public static final String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+ field public static final String COLUMN_RELEASE_DATE = "release_date";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_STARTING_PRICE = "starting_price";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_TRANSIENT = "transient";
+ field public static final String COLUMN_TV_SERIES_ITEM_TYPE = "tv_series_item_type";
+ field public static final String COLUMN_TYPE = "type";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String COLUMN_WEIGHT = "weight";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
+ field public static final android.net.Uri! CONTENT_URI;
+ field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+ field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+ field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+ field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+ field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+ field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+ field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+ field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+ field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+ field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+ field public static final int TV_SERIES_ITEM_TYPE_CHAPTER = 1; // 0x1
+ field public static final int TV_SERIES_ITEM_TYPE_EPISODE = 0; // 0x0
+ field public static final int TYPE_ALBUM = 8; // 0x8
+ field public static final int TYPE_ARTIST = 9; // 0x9
+ field public static final int TYPE_CHANNEL = 6; // 0x6
+ field public static final int TYPE_CLIP = 4; // 0x4
+ field public static final int TYPE_EVENT = 5; // 0x5
+ field public static final int TYPE_GAME = 12; // 0xc
+ field public static final int TYPE_MOVIE = 0; // 0x0
+ field public static final int TYPE_PLAYLIST = 10; // 0xa
+ field public static final int TYPE_STATION = 11; // 0xb
+ field public static final int TYPE_TRACK = 7; // 0x7
+ field public static final int TYPE_TV_EPISODE = 3; // 0x3
+ field public static final int TYPE_TV_SEASON = 2; // 0x2
+ field public static final int TYPE_TV_SERIES = 1; // 0x1
+ }
+
+ public static final class TvContractCompat.Programs implements androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns {
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field @Deprecated public static final String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field @Deprecated public static final String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+ field public static final android.net.Uri! CONTENT_URI;
+ field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+ field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+ field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+ }
+
+ public static final class TvContractCompat.Programs.Genres {
+ method public static String[]! decode(String);
+ method public static String! encode(java.lang.String...);
+ method public static boolean isCanonical(String!);
+ field public static final String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+ field public static final String ARTS = "ARTS";
+ field public static final String COMEDY = "COMEDY";
+ field public static final String DRAMA = "DRAMA";
+ field public static final String EDUCATION = "EDUCATION";
+ field public static final String ENTERTAINMENT = "ENTERTAINMENT";
+ field public static final String FAMILY_KIDS = "FAMILY_KIDS";
+ field public static final String GAMING = "GAMING";
+ field public static final String LIFE_STYLE = "LIFE_STYLE";
+ field public static final String MOVIES = "MOVIES";
+ field public static final String MUSIC = "MUSIC";
+ field public static final String NEWS = "NEWS";
+ field public static final String PREMIER = "PREMIER";
+ field public static final String SHOPPING = "SHOPPING";
+ field public static final String SPORTS = "SPORTS";
+ field public static final String TECH_SCIENCE = "TECH_SCIENCE";
+ field public static final String TRAVEL = "TRAVEL";
+ }
+
+ public static final class TvContractCompat.RecordedPrograms implements androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns {
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_INPUT_ID = "input_id";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+ field public static final String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+ field public static final String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+ field public static final String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+ field public static final android.net.Uri! CONTENT_URI;
+ field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+ field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+ field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+ }
+
+ public static final class TvContractCompat.WatchNextPrograms implements androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns {
+ field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+ field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+ field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+ field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+ field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+ field public static final int ASPECT_RATIO_MOVIE_POSTER = 5; // 0x5
+ field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+ field public static final int AVAILABILITY_FREE = 4; // 0x4
+ field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+ field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+ field public static final int AVAILABILITY_PURCHASED = 3; // 0x3
+ field public static final String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final String COLUMN_AUTHOR = "author";
+ field public static final String COLUMN_AVAILABILITY = "availability";
+ field public static final String COLUMN_BROWSABLE = "browsable";
+ field public static final String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final String COLUMN_CONTENT_ID = "content_id";
+ field public static final String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final String COLUMN_DURATION_MILLIS = "duration_millis";
+ field public static final String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+ field public static final String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final String COLUMN_GENRE = "genre";
+ field public static final String COLUMN_INTENT_URI = "intent_uri";
+ field public static final String COLUMN_INTERACTION_COUNT = "interaction_count";
+ field public static final String COLUMN_INTERACTION_TYPE = "interaction_type";
+ field public static final String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+ field public static final String COLUMN_ITEM_COUNT = "item_count";
+ field public static final String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
+ field public static final String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+ field public static final String COLUMN_LIVE = "live";
+ field public static final String COLUMN_LOGO_CONTENT_DESCRIPTION = "logo_content_description";
+ field public static final String COLUMN_LOGO_URI = "logo_uri";
+ field public static final String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final String COLUMN_OFFER_PRICE = "offer_price";
+ field public static final String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+ field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final String COLUMN_PREVIEW_AUDIO_URI = "preview_audio_uri";
+ field public static final String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+ field public static final String COLUMN_RELEASE_DATE = "release_date";
+ field public static final String COLUMN_REVIEW_RATING = "review_rating";
+ field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+ field public static final String COLUMN_SEARCHABLE = "searchable";
+ field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+ field public static final String COLUMN_SEASON_TITLE = "season_title";
+ field public static final String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final String COLUMN_STARTING_PRICE = "starting_price";
+ field public static final String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+ field public static final String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final String COLUMN_TITLE = "title";
+ field public static final String COLUMN_TRANSIENT = "transient";
+ field public static final String COLUMN_TV_SERIES_ITEM_TYPE = "tv_series_item_type";
+ field public static final String COLUMN_TYPE = "type";
+ field public static final String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
+ field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
+ field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
+ field public static final android.net.Uri! CONTENT_URI;
+ field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+ field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+ field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+ field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+ field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+ field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+ field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+ field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+ field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+ field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+ field public static final int TV_SERIES_ITEM_TYPE_CHAPTER = 1; // 0x1
+ field public static final int TV_SERIES_ITEM_TYPE_EPISODE = 0; // 0x0
+ field public static final int TYPE_ALBUM = 8; // 0x8
+ field public static final int TYPE_ARTIST = 9; // 0x9
+ field public static final int TYPE_CHANNEL = 6; // 0x6
+ field public static final int TYPE_CLIP = 4; // 0x4
+ field public static final int TYPE_EVENT = 5; // 0x5
+ field public static final int TYPE_GAME = 12; // 0xc
+ field public static final int TYPE_MOVIE = 0; // 0x0
+ field public static final int TYPE_PLAYLIST = 10; // 0xa
+ field public static final int TYPE_STATION = 11; // 0xb
+ field public static final int TYPE_TRACK = 7; // 0x7
+ field public static final int TYPE_TV_EPISODE = 3; // 0x3
+ field public static final int TYPE_TV_SEASON = 2; // 0x2
+ field public static final int TYPE_TV_SERIES = 1; // 0x1
+ field public static final int WATCH_NEXT_TYPE_CONTINUE = 0; // 0x0
+ field public static final int WATCH_NEXT_TYPE_NEW = 2; // 0x2
+ field public static final int WATCH_NEXT_TYPE_NEXT = 1; // 0x1
+ field public static final int WATCH_NEXT_TYPE_WATCHLIST = 3; // 0x3
+ }
+
+ public final class WatchNextProgram {
+ method public static androidx.tvprovider.media.tv.WatchNextProgram! fromCursor(android.database.Cursor!);
+ method public String[]! getAudioLanguages();
+ method public String! getAuthor();
+ method public int getAvailability();
+ method public String[]! getCanonicalGenres();
+ method public String! getContentId();
+ method public android.media.tv.TvContentRating[]! getContentRatings();
+ method public String! getDescription();
+ method public int getDurationMillis();
+ method public long getEndTimeUtcMillis();
+ method public String! getEpisodeNumber();
+ method public String! getEpisodeTitle();
+ method public String! getGenre();
+ method public long getId();
+ method public android.content.Intent! getIntent() throws java.net.URISyntaxException;
+ method public android.net.Uri! getIntentUri();
+ method public long getInteractionCount();
+ method public int getInteractionType();
+ method public byte[]! getInternalProviderDataByteArray();
+ method public Long! getInternalProviderFlag1();
+ method public Long! getInternalProviderFlag2();
+ method public Long! getInternalProviderFlag3();
+ method public Long! getInternalProviderFlag4();
+ method public String! getInternalProviderId();
+ method public int getItemCount();
+ method public long getLastEngagementTimeUtcMillis();
+ method public int getLastPlaybackPositionMillis();
+ method public String! getLogoContentDescription();
+ method public android.net.Uri! getLogoUri();
+ method public String! getLongDescription();
+ method public String! getOfferPrice();
+ method public int getPosterArtAspectRatio();
+ method public android.net.Uri! getPosterArtUri();
+ method public android.net.Uri! getPreviewAudioUri();
+ method public android.net.Uri! getPreviewVideoUri();
+ method public String! getReleaseDate();
+ method public String! getReviewRating();
+ method public int getReviewRatingStyle();
+ method public String! getSeasonNumber();
+ method public String! getSeasonTitle();
+ method public long getStartTimeUtcMillis();
+ method public String! getStartingPrice();
+ method public int getThumbnailAspectRatio();
+ method public android.net.Uri! getThumbnailUri();
+ method public String! getTitle();
+ method public int getTvSeriesItemType();
+ method public int getType();
+ method public int getVideoHeight();
+ method public int getVideoWidth();
+ method public int getWatchNextType();
+ method public boolean hasAnyUpdatedValues(androidx.tvprovider.media.tv.WatchNextProgram!);
+ method public boolean isBrowsable();
+ method public boolean isLive();
+ method public boolean isSearchable();
+ method public boolean isTransient();
+ method public android.content.ContentValues! toContentValues();
+ field public static final int WATCH_NEXT_TYPE_UNKNOWN = -1; // 0xffffffff
+ }
+
+ public static final class WatchNextProgram.Builder {
+ ctor public WatchNextProgram.Builder();
+ ctor public WatchNextProgram.Builder(androidx.tvprovider.media.tv.WatchNextProgram!);
+ method public androidx.tvprovider.media.tv.WatchNextProgram! build();
+ method public androidx.tvprovider.media.tv.WatchNextProgram.Builder! setLastEngagementTimeUtcMillis(long);
+ method public androidx.tvprovider.media.tv.WatchNextProgram.Builder! setWatchNextType(int);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/tv-provider/api/res-1.1.0-alpha01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to tv-provider/api/res-1.1.0-alpha01.txt
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java
index 3066427..1ca313e 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java
@@ -16,7 +16,7 @@
package androidx.tvprovider.media.tv;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.content.Intent;
@@ -46,7 +46,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String[] PROJECTION = getProjection();
private static final int INVALID_INT_VALUE = -1;
@@ -73,7 +73,7 @@
PreviewProgramColumns.TYPE_GAME
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface Type {}
/**
@@ -92,7 +92,7 @@
PreviewProgramColumns.ASPECT_RATIO_MOVIE_POSTER
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface AspectRatio {}
/**
@@ -110,7 +110,7 @@
PreviewProgramColumns.AVAILABILITY_FREE
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface Availability {}
/**
@@ -130,7 +130,7 @@
PreviewProgramColumns.INTERACTION_TYPE_VIEWERS,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface InteractionType {}
/** @hide */
@@ -139,7 +139,7 @@
PreviewProgramColumns.TV_SERIES_ITEM_TYPE_CHAPTER
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface TvSeriesItemType {}
/**
@@ -422,7 +422,7 @@
* @param includeProtectedFields Whether the fields protected by system is included or not.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ContentValues toContentValues(boolean includeProtectedFields) {
ContentValues values = super.toContentValues();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
@@ -976,7 +976,7 @@
* @see androidx.tvprovider.media.tv.TvContractCompat.PreviewPrograms#COLUMN_BROWSABLE
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public T setBrowsable(boolean browsable) {
mValues.put(PreviewPrograms.COLUMN_BROWSABLE, browsable ? IS_BROWSABLE : 0);
return (T) this;
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java
index 964ba34..d2ae4e7 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/BaseProgram.java
@@ -16,7 +16,7 @@
package androidx.tvprovider.media.tv;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.database.Cursor;
@@ -44,7 +44,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String[] PROJECTION = getProjection();
private static final long INVALID_LONG_VALUE = -1;
@@ -59,7 +59,7 @@
ProgramColumns.REVIEW_RATING_STYLE_PERCENTAGE,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@interface ReviewRatingStyle {}
/**
@@ -68,7 +68,7 @@
private static final int REVIEW_RATING_STYLE_UNKNOWN = -1;
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected ContentValues mValues;
/* package-private */
@@ -90,7 +90,7 @@
* @see androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns#COLUMN_PACKAGE_NAME
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public String getPackageName() {
return mValues.getAsString(BaseTvColumns.COLUMN_PACKAGE_NAME);
}
@@ -520,7 +520,7 @@
*/
public abstract static class Builder<T extends Builder> {
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected ContentValues mValues;
/**
@@ -558,7 +558,7 @@
* @see androidx.tvprovider.media.tv.TvContractCompat.BaseTvColumns#COLUMN_PACKAGE_NAME
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public T setPackageName(String packageName) {
mValues.put(BaseTvColumns.COLUMN_PACKAGE_NAME, packageName);
return (T) this;
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/Channel.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/Channel.java
index 45ee34c..4540289 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/Channel.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/Channel.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.content.Intent;
@@ -80,7 +80,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String[] PROJECTION = getProjection();
private static final long INVALID_CHANNEL_ID = -1;
@@ -312,7 +312,7 @@
* @return The value of {@link Channels#COLUMN_SYSTEM_APPROVED} for the channel.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public boolean isSystemApproved() {
Integer i = mValues.getAsInteger(Channels.COLUMN_SYSTEM_APPROVED);
return i != null && i == IS_SYSTEM_APPROVED;
@@ -372,7 +372,7 @@
* @param includeProtectedFields Whether the fields protected by system is included or not.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ContentValues toContentValues(boolean includeProtectedFields) {
ContentValues values = new ContentValues(mValues);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
@@ -621,7 +621,7 @@
* @return This Builder object to allow for chaining of calls to builder methods.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Builder setPackageName(String packageName) {
mValues.put(Channels.COLUMN_PACKAGE_NAME, packageName);
return this;
@@ -936,7 +936,7 @@
* @return This Builder object to allow for chaining of calls to builder methods.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder setBrowsable(boolean value) {
mValues.put(Channels.COLUMN_BROWSABLE, value ? IS_BROWSABLE : 0);
return this;
@@ -949,7 +949,7 @@
* @return This Builder object to allow for chaining of calls to builder methods.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder setSystemApproved(boolean value) {
mValues.put(Channels.COLUMN_SYSTEM_APPROVED, value ? IS_SYSTEM_APPROVED : 0);
return this;
@@ -989,7 +989,7 @@
* @return This Builder object to allow for chaining of calls to builder methods.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public Builder setLocked(boolean value) {
mValues.put(Channels.COLUMN_LOCKED, value ? IS_LOCKED : 0);
return this;
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/CollectionUtils.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/CollectionUtils.java
index 595e451..70963689 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/CollectionUtils.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/CollectionUtils.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -25,7 +25,7 @@
* Static utilities for collections
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class CollectionUtils {
/**
* Returns an array with the arrays concatenated together.
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannel.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannel.java
index b0f4b8e..d7053ca 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannel.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannel.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.content.Context;
@@ -186,7 +186,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
boolean isLogoChanged() {
return mLogoChanged;
}
@@ -194,7 +194,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Uri getLogoUri() {
return mLogoUri;
}
@@ -292,7 +292,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public ContentValues toContentValues() {
ContentValues values = new ContentValues(mValues);
return values;
@@ -301,7 +301,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static class Columns {
public static final String[] PROJECTION = {
Channels._ID,
@@ -366,7 +366,7 @@
* @return This Builder object to allow for chaining of calls to builder methods.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
Builder setPackageName(String packageName) {
mValues.put(Channels.COLUMN_PACKAGE_NAME, packageName);
return this;
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannelHelper.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannelHelper.java
index 06876c3..40b0bf8 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannelHelper.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewChannelHelper.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
@@ -245,7 +245,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
protected void updatePreviewChannelInternal(long channelId, @NonNull PreviewChannel upgrade) {
mContext.getContentResolver().update(
TvContractCompat.buildChannelUri(channelId),
@@ -407,7 +407,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void updatePreviewProgramInternal(long programId, @NonNull PreviewProgram upgrade) {
mContext.getContentResolver().update(
TvContractCompat.buildPreviewProgramUri(programId),
@@ -468,7 +468,7 @@
*
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
void updateWatchNextProgram(long programId, @NonNull WatchNextProgram upgrade) {
mContext.getContentResolver().update(
TvContractCompat.buildWatchNextProgramUri(programId),
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewProgram.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewProgram.java
index 2b6a82e..4b1b353 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewProgram.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/PreviewProgram.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.database.Cursor;
@@ -78,7 +78,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String[] PROJECTION = getProjection();
private static final long INVALID_LONG_VALUE = -1;
@@ -150,7 +150,7 @@
* @param includeProtectedFields Whether the fields protected by system is included or not.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public ContentValues toContentValues(boolean includeProtectedFields) {
ContentValues values = super.toContentValues(includeProtectedFields);
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/Program.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/Program.java
index b0808d0..4a4b3bd 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/Program.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/Program.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.database.Cursor;
@@ -75,7 +75,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String[] PROJECTION = getProjection();
private static final long INVALID_LONG_VALUE = -1;
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractCompat.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractCompat.java
index 6242c50..1364515 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractCompat.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractCompat.java
@@ -16,7 +16,7 @@
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.app.Activity;
import android.content.ComponentName;
@@ -72,7 +72,7 @@
* information available on the system.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PERMISSION_READ_TV_LISTINGS = "android.permission.READ_TV_LISTINGS";
private static final String PATH_CHANNEL = "channel";
@@ -95,7 +95,7 @@
* </ul>
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String ACTION_CHANNEL_BROWSABLE_REQUESTED =
"android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
@@ -181,7 +181,7 @@
* The key for a bundle parameter containing a package name as a string.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String EXTRA_PACKAGE_NAME = "android.media.tv.extra.PACKAGE_NAME";
/** The key for a bundle parameter containing a program ID as a long integer. */
@@ -208,7 +208,7 @@
* @see #EXTRA_EXISTING_COLUMN_NAMES
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String METHOD_GET_COLUMNS = "get_columns";
/**
@@ -238,7 +238,7 @@
* @see #EXTRA_EXISTING_COLUMN_NAMES
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String METHOD_ADD_COLUMN = "add_column";
/**
@@ -249,7 +249,7 @@
* @see #METHOD_ADD_COLUMN
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String EXTRA_EXISTING_COLUMN_NAMES =
"android.media.tv.extra.EXISTING_COLUMN_NAMES";
@@ -260,7 +260,7 @@
* @see #METHOD_ADD_COLUMN
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String EXTRA_COLUMN_NAME = "android.media.tv.extra.COLUMN_NAME";
/**
@@ -271,7 +271,7 @@
* @see #METHOD_ADD_COLUMN
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String EXTRA_DATA_TYPE = "android.media.tv.extra.DATA_TYPE";
/**
@@ -282,7 +282,7 @@
* @see #METHOD_ADD_COLUMN
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String EXTRA_DEFAULT_VALUE = "android.media.tv.extra.DEFAULT_VALUE";
/**
@@ -290,7 +290,7 @@
* ID to filter channels.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARAM_INPUT = "input";
/**
@@ -298,7 +298,7 @@
* ID to filter programs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARAM_CHANNEL = "channel";
/**
@@ -306,7 +306,7 @@
* time (in milliseconds since the epoch) to filter programs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARAM_START_TIME = "start_time";
/**
@@ -314,7 +314,7 @@
* (in milliseconds since the epoch) to filter programs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARAM_END_TIME = "end_time";
/**
@@ -323,7 +323,7 @@
* not affected.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARAM_BROWSABLE_ONLY = "browsable_only";
/**
@@ -331,7 +331,7 @@
* genre to filter programs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String PARAM_CANONICAL_GENRE = "canonical_genre";
/**
@@ -602,7 +602,7 @@
* Common columns for the tables of TV programs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
interface ProgramColumns {
/**
* The review rating style for five star rating.
@@ -920,7 +920,7 @@
* Common columns for the tables of preview programs.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public interface PreviewProgramColumns {
/**
* The program type for movie.
@@ -1537,7 +1537,7 @@
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({
TYPE_OTHER,
TYPE_NTSC,
@@ -1751,7 +1751,7 @@
public static final String TYPE_PREVIEW = "TYPE_PREVIEW";
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({
SERVICE_TYPE_OTHER,
SERVICE_TYPE_AUDIO_VIDEO,
@@ -1770,7 +1770,7 @@
public static final String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({
VIDEO_FORMAT_240P,
VIDEO_FORMAT_360P,
@@ -1820,7 +1820,7 @@
public static final String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
/** @hide */
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@StringDef({
VIDEO_RESOLUTION_SD,
VIDEO_RESOLUTION_ED,
@@ -2284,7 +2284,7 @@
* <p>Type: INTEGER (boolean)
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String COLUMN_SYSTEM_APPROVED = "system_approved";
/**
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractUtils.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractUtils.java
index 99383c0..18d897d 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractUtils.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/TvContractUtils.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.media.tv.TvContentRating;
import android.text.TextUtils;
@@ -30,7 +30,7 @@
* Static helper methods for working with {@link android.media.tv.TvContract}.
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public class TvContractUtils {
static final TvContentRating[] EMPTY = new TvContentRating[0];
diff --git a/tv-provider/src/main/java/androidx/tvprovider/media/tv/WatchNextProgram.java b/tv-provider/src/main/java/androidx/tvprovider/media/tv/WatchNextProgram.java
index 5c7d17e..3bfe6b3 100644
--- a/tv-provider/src/main/java/androidx/tvprovider/media/tv/WatchNextProgram.java
+++ b/tv-provider/src/main/java/androidx/tvprovider/media/tv/WatchNextProgram.java
@@ -15,7 +15,7 @@
*/
package androidx.tvprovider.media.tv;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.content.ContentValues;
import android.database.Cursor;
@@ -81,7 +81,7 @@
/**
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static final String[] PROJECTION = getProjection();
private static final long INVALID_LONG_VALUE = -1;
@@ -96,7 +96,7 @@
WatchNextPrograms.WATCH_NEXT_TYPE_WATCHLIST,
})
@Retention(RetentionPolicy.SOURCE)
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface WatchNextType {
}
@@ -173,7 +173,7 @@
* @param includeProtectedFields Whether the fields protected by system is included or not.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@Override
public ContentValues toContentValues(boolean includeProtectedFields) {
ContentValues values = super.toContentValues(includeProtectedFields);
diff --git a/versionedparcelable/build.gradle b/versionedparcelable/build.gradle
index 1f5ae98..27858d6 100644
--- a/versionedparcelable/build.gradle
+++ b/versionedparcelable/build.gradle
@@ -24,7 +24,7 @@
}
dependencies {
- implementation("androidx.annotation:annotation:1.0.0")
+ implementation(project(":annotation"))
implementation("androidx.collection:collection:1.0.0")
androidTestImplementation(TEST_EXT_JUNIT)
diff --git a/versionedparcelable/src/main/java/androidx/versionedparcelable/CustomVersionedParcelable.java b/versionedparcelable/src/main/java/androidx/versionedparcelable/CustomVersionedParcelable.java
index 598b07c..9fc9bdd2 100644
--- a/versionedparcelable/src/main/java/androidx/versionedparcelable/CustomVersionedParcelable.java
+++ b/versionedparcelable/src/main/java/androidx/versionedparcelable/CustomVersionedParcelable.java
@@ -23,7 +23,7 @@
* and right after deserialization to handle custom fields.
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class CustomVersionedParcelable implements VersionedParcelable {
/**
@@ -31,7 +31,7 @@
* to handle any custom fields that cannot be easily annotated.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public void onPreParceling(boolean isStream) {
}
@@ -40,7 +40,7 @@
* to handle any custom fields that cannot be easily annotated.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public void onPostParceling() {
}
}
diff --git a/versionedparcelable/src/main/java/androidx/versionedparcelable/NonParcelField.java b/versionedparcelable/src/main/java/androidx/versionedparcelable/NonParcelField.java
index 7a5a850..1fd53ec 100644
--- a/versionedparcelable/src/main/java/androidx/versionedparcelable/NonParcelField.java
+++ b/versionedparcelable/src/main/java/androidx/versionedparcelable/NonParcelField.java
@@ -16,7 +16,7 @@
package androidx.versionedparcelable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
@@ -32,6 +32,6 @@
*/
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface NonParcelField {
}
diff --git a/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java b/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
index c2590d8..9a5d6f1 100644
--- a/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
+++ b/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
@@ -29,7 +29,7 @@
*/
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public @interface ParcelField {
int value();
diff --git a/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java b/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
index 3626a47..b9b3b04 100644
--- a/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
+++ b/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
@@ -16,7 +16,7 @@
package androidx.versionedparcelable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
import android.os.Parcelable;
@@ -41,7 +41,7 @@
* Turn a VersionedParcelable into a Parcelable
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Parcelable toParcelable(VersionedParcelable obj) {
return new ParcelImpl(obj);
}
@@ -50,7 +50,7 @@
* Turn a Parcelable into a VersionedParcelable.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressWarnings("TypeParameterUnusedInFormals")
public static <T extends VersionedParcelable> T fromParcelable(Parcelable p) {
if (!(p instanceof ParcelImpl)) {
@@ -63,7 +63,7 @@
* Write a VersionedParcelable into an OutputStream.
* @hide
*/
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static void toOutputStream(VersionedParcelable obj, OutputStream output) {
VersionedParcelStream stream = new VersionedParcelStream(null, output);
stream.writeVersionedParcelable(obj);
@@ -75,7 +75,7 @@
* @hide
*/
@SuppressWarnings("TypeParameterUnusedInFormals")
- @RestrictTo(LIBRARY_GROUP)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static <T extends VersionedParcelable> T fromInputStream(InputStream input) {
VersionedParcelStream stream = new VersionedParcelStream(input, null);
return stream.readVersionedParcelable();
diff --git a/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java b/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
index 9a09dc9c..bf30feb 100644
--- a/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
+++ b/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
@@ -16,7 +16,7 @@
package androidx.versionedparcelable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.BadParcelableException;
import android.os.Build;
@@ -54,7 +54,7 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class VersionedParcel {
private static final String TAG = "VersionedParcel";
diff --git a/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java b/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
index fe920ce..25b417a 100644
--- a/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
+++ b/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
@@ -16,7 +16,7 @@
package androidx.versionedparcelable;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.IBinder;
import android.os.IInterface;
@@ -38,7 +38,7 @@
*/
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
public @interface VersionedParcelize {
/**
* Whether or not to allow this VersionedParcelable to be used with
diff --git a/viewpager2/api/1.0.0-alpha02.txt b/viewpager2/api/1.0.0-alpha02.txt
new file mode 100644
index 0000000..fec64af
--- /dev/null
+++ b/viewpager2/api/1.0.0-alpha02.txt
@@ -0,0 +1,75 @@
+// Signature format: 3.0
+package androidx.viewpager2.adapter {
+
+ public abstract class FragmentStateAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.viewpager2.adapter.FragmentViewHolder> implements androidx.viewpager2.adapter.StatefulAdapter {
+ ctor public FragmentStateAdapter(androidx.fragment.app.FragmentManager);
+ method public boolean containsItem(long);
+ method public abstract androidx.fragment.app.Fragment getItem(int);
+ method public final void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+ method public final void onBindViewHolder(androidx.viewpager2.adapter.FragmentViewHolder, int);
+ method public final androidx.viewpager2.adapter.FragmentViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+ method public final void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+ method public final boolean onFailedToRecycleView(androidx.viewpager2.adapter.FragmentViewHolder);
+ method public final void onViewAttachedToWindow(androidx.viewpager2.adapter.FragmentViewHolder);
+ method public final void onViewRecycled(androidx.viewpager2.adapter.FragmentViewHolder);
+ method public void restoreState(android.os.Parcelable);
+ method public android.os.Parcelable saveState();
+ method public final void setHasStableIds(boolean);
+ }
+
+ public final class FragmentViewHolder extends androidx.recyclerview.widget.RecyclerView.ViewHolder {
+ }
+
+ public interface StatefulAdapter {
+ method public void restoreState(android.os.Parcelable);
+ method public android.os.Parcelable saveState();
+ }
+
+}
+
+package androidx.viewpager2.widget {
+
+ public class ViewPager2 extends android.view.ViewGroup {
+ ctor public ViewPager2(android.content.Context);
+ ctor public ViewPager2(android.content.Context, android.util.AttributeSet?);
+ ctor public ViewPager2(android.content.Context, android.util.AttributeSet?, int);
+ ctor @RequiresApi(21) public ViewPager2(android.content.Context, android.util.AttributeSet?, int, int);
+ method public final androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+ method public final int getCurrentItem();
+ method @androidx.viewpager2.widget.ViewPager2.Orientation public final int getOrientation();
+ method public boolean isUserInputEnabled();
+ method public final void onViewAdded(android.view.View!);
+ method public final void registerOnPageChangeCallback(androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback);
+ method public final void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
+ method public final void setCurrentItem(int);
+ method public final void setCurrentItem(int, boolean);
+ method public final void setOrientation(@androidx.viewpager2.widget.ViewPager2.Orientation int);
+ method public final void setPageTransformer(androidx.viewpager2.widget.ViewPager2.PageTransformer?);
+ method public void setUserInputEnabled(boolean);
+ method public final void unregisterOnPageChangeCallback(androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback);
+ field public static final int ORIENTATION_HORIZONTAL = 0; // 0x0
+ field public static final int ORIENTATION_VERTICAL = 1; // 0x1
+ 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 abstract static class ViewPager2.OnPageChangeCallback {
+ ctor public ViewPager2.OnPageChangeCallback();
+ method public void onPageScrollStateChanged(@androidx.viewpager2.widget.ViewPager2.ScrollState int);
+ method public void onPageScrolled(int, float, @Px int);
+ method public void onPageSelected(int);
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL, androidx.viewpager2.widget.ViewPager2.ORIENTATION_VERTICAL}) public static @interface ViewPager2.Orientation {
+ }
+
+ public static interface ViewPager2.PageTransformer {
+ method public void transformPage(android.view.View, float);
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE, androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_DRAGGING, androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_SETTLING}) public static @interface ViewPager2.ScrollState {
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/viewpager2/api/res-1.0.0-alpha02.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to viewpager2/api/res-1.0.0-alpha02.txt
diff --git a/wear/api/1.1.0-alpha01.txt b/wear/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..6609d67
--- /dev/null
+++ b/wear/api/1.1.0-alpha01.txt
@@ -0,0 +1,329 @@
+// Signature format: 3.0
+package androidx.wear.activity {
+
+ public class ConfirmationActivity extends android.app.Activity {
+ ctor public ConfirmationActivity();
+ method protected void onAnimationFinished();
+ method public void onCreate(android.os.Bundle!);
+ field public static final String EXTRA_ANIMATION_TYPE = "androidx.wear.activity.extra.ANIMATION_TYPE";
+ field public static final String EXTRA_MESSAGE = "androidx.wear.activity.extra.MESSAGE";
+ field public static final int FAILURE_ANIMATION = 3; // 0x3
+ field public static final int OPEN_ON_PHONE_ANIMATION = 2; // 0x2
+ field public static final int SUCCESS_ANIMATION = 1; // 0x1
+ }
+
+}
+
+package androidx.wear.ambient {
+
+ @Deprecated public final class AmbientMode extends android.app.Fragment {
+ ctor @Deprecated public AmbientMode();
+ method @Deprecated public static <T extends android.app.Activity> androidx.wear.ambient.AmbientMode.AmbientController! attachAmbientSupport(T!);
+ field @Deprecated public static final String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+ field @Deprecated public static final String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+ field @Deprecated public static final String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+ }
+
+ @Deprecated public abstract static class AmbientMode.AmbientCallback {
+ ctor @Deprecated public AmbientMode.AmbientCallback();
+ method @Deprecated public void onAmbientOffloadInvalidated();
+ method @Deprecated public void onEnterAmbient(android.os.Bundle!);
+ method @Deprecated public void onExitAmbient();
+ method @Deprecated public void onUpdateAmbient();
+ }
+
+ @Deprecated public static interface AmbientMode.AmbientCallbackProvider {
+ method @Deprecated public androidx.wear.ambient.AmbientMode.AmbientCallback! getAmbientCallback();
+ }
+
+ @Deprecated public final class AmbientMode.AmbientController {
+ method @Deprecated public boolean isAmbient();
+ method @Deprecated public void setAmbientOffloadEnabled(boolean);
+ }
+
+ public final class AmbientModeSupport extends androidx.fragment.app.Fragment {
+ ctor public AmbientModeSupport();
+ method public static <T extends androidx.fragment.app.FragmentActivity> androidx.wear.ambient.AmbientModeSupport.AmbientController! attach(T!);
+ field public static final String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+ field public static final String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+ field public static final String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+ }
+
+ public abstract static class AmbientModeSupport.AmbientCallback {
+ ctor public AmbientModeSupport.AmbientCallback();
+ method public void onAmbientOffloadInvalidated();
+ method public void onEnterAmbient(android.os.Bundle!);
+ method public void onExitAmbient();
+ method public void onUpdateAmbient();
+ }
+
+ public static interface AmbientModeSupport.AmbientCallbackProvider {
+ method public androidx.wear.ambient.AmbientModeSupport.AmbientCallback! getAmbientCallback();
+ }
+
+ public final class AmbientModeSupport.AmbientController {
+ method public boolean isAmbient();
+ method public void setAmbientOffloadEnabled(boolean);
+ }
+
+}
+
+package androidx.wear.utils {
+
+ public class MetadataConstants {
+ method public static int getPreviewDrawableResourceId(android.content.Context!, boolean);
+ method public static boolean isNotificationBridgingEnabled(android.content.Context!);
+ method public static boolean isStandalone(android.content.Context!);
+ field public static final String NOTIFICATION_BRIDGE_MODE_BRIDGING = "BRIDGING";
+ field public static final String NOTIFICATION_BRIDGE_MODE_METADATA_NAME = "com.google.android.wearable.notificationBridgeMode";
+ field public static final String NOTIFICATION_BRIDGE_MODE_NO_BRIDGING = "NO_BRIDGING";
+ field public static final String STANDALONE_METADATA_NAME = "com.google.android.wearable.standalone";
+ field public static final String WATCH_FACE_PREVIEW_CIRCULAR_METADATA_NAME = "com.google.android.wearable.watchface.preview_circular";
+ field public static final String WATCH_FACE_PREVIEW_METADATA_NAME = "com.google.android.wearable.watchface.preview";
+ }
+
+}
+
+package androidx.wear.widget {
+
+ @UiThread public class BoxInsetLayout extends android.view.ViewGroup {
+ ctor public BoxInsetLayout(android.content.Context);
+ ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?);
+ ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?, @StyleRes int);
+ method public androidx.wear.widget.BoxInsetLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ }
+
+ public static class BoxInsetLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+ ctor public BoxInsetLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
+ ctor public BoxInsetLayout.LayoutParams(int, int);
+ ctor public BoxInsetLayout.LayoutParams(int, int, int);
+ ctor public BoxInsetLayout.LayoutParams(int, int, int, int);
+ ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+ ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+ ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+ ctor public BoxInsetLayout.LayoutParams(androidx.wear.widget.BoxInsetLayout.LayoutParams);
+ field public static final int BOX_ALL = 15; // 0xf
+ field public static final int BOX_BOTTOM = 8; // 0x8
+ field public static final int BOX_LEFT = 1; // 0x1
+ field public static final int BOX_NONE = 0; // 0x0
+ field public static final int BOX_RIGHT = 4; // 0x4
+ field public static final int BOX_TOP = 2; // 0x2
+ field public int boxedEdges;
+ }
+
+ public class CircularProgressLayout extends android.widget.FrameLayout {
+ ctor public CircularProgressLayout(android.content.Context!);
+ ctor public CircularProgressLayout(android.content.Context!, android.util.AttributeSet!);
+ ctor public CircularProgressLayout(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public CircularProgressLayout(android.content.Context!, android.util.AttributeSet!, int, int);
+ method @ColorInt public int getBackgroundColor();
+ method public int[]! getColorSchemeColors();
+ method public androidx.wear.widget.CircularProgressLayout.OnTimerFinishedListener? getOnTimerFinishedListener();
+ method public androidx.swiperefreshlayout.widget.CircularProgressDrawable getProgressDrawable();
+ method public float getStartingRotation();
+ method public float getStrokeWidth();
+ method public long getTotalTime();
+ method public boolean isIndeterminate();
+ method public boolean isTimerRunning();
+ method public void setColorSchemeColors(int...!);
+ method public void setIndeterminate(boolean);
+ method public void setOnTimerFinishedListener(androidx.wear.widget.CircularProgressLayout.OnTimerFinishedListener?);
+ method public void setStartingRotation(float);
+ method public void setStrokeWidth(float);
+ method public void setTotalTime(long);
+ method public void startTimer();
+ method public void stopTimer();
+ }
+
+ public static interface CircularProgressLayout.OnTimerFinishedListener {
+ method public void onTimerFinished(androidx.wear.widget.CircularProgressLayout!);
+ }
+
+ public class ConfirmationOverlay {
+ ctor public ConfirmationOverlay();
+ method public androidx.wear.widget.ConfirmationOverlay! setDuration(int);
+ method public androidx.wear.widget.ConfirmationOverlay! setFinishedAnimationListener(androidx.wear.widget.ConfirmationOverlay.OnAnimationFinishedListener?);
+ method public androidx.wear.widget.ConfirmationOverlay! setMessage(String!);
+ method public androidx.wear.widget.ConfirmationOverlay! setType(@androidx.wear.widget.ConfirmationOverlay.OverlayType int);
+ method @MainThread public void showAbove(android.view.View!);
+ method @MainThread public void showOn(android.app.Activity!);
+ field public static final int DEFAULT_ANIMATION_DURATION_MS = 1000; // 0x3e8
+ field public static final int FAILURE_ANIMATION = 1; // 0x1
+ field public static final int OPEN_ON_PHONE_ANIMATION = 2; // 0x2
+ field public static final int SUCCESS_ANIMATION = 0; // 0x0
+ }
+
+ public static interface ConfirmationOverlay.OnAnimationFinishedListener {
+ method public void onAnimationFinished();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.wear.widget.ConfirmationOverlay.SUCCESS_ANIMATION, androidx.wear.widget.ConfirmationOverlay.FAILURE_ANIMATION, androidx.wear.widget.ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION}) public static @interface ConfirmationOverlay.OverlayType {
+ }
+
+ public class CurvingLayoutCallback extends androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback {
+ ctor public CurvingLayoutCallback(android.content.Context!);
+ method public void adjustAnchorOffsetXY(android.view.View!, float[]!);
+ method public void onLayoutFinished(android.view.View!, androidx.recyclerview.widget.RecyclerView!);
+ }
+
+ public class RoundedDrawable extends android.graphics.drawable.Drawable {
+ ctor public RoundedDrawable();
+ method public void draw(android.graphics.Canvas);
+ method @ColorInt public int getBackgroundColor();
+ method public android.graphics.drawable.Drawable? getDrawable();
+ method public int getOpacity();
+ method public int getRadius();
+ method public boolean isClipEnabled();
+ method public void setAlpha(int);
+ method public void setBackgroundColor(@ColorInt int);
+ method public void setClipEnabled(boolean);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDrawable(android.graphics.drawable.Drawable?);
+ method public void setRadius(int);
+ }
+
+ @UiThread public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
+ ctor public SwipeDismissFrameLayout(android.content.Context!);
+ ctor public SwipeDismissFrameLayout(android.content.Context!, android.util.AttributeSet!);
+ ctor public SwipeDismissFrameLayout(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public SwipeDismissFrameLayout(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public void addCallback(androidx.wear.widget.SwipeDismissFrameLayout.Callback!);
+ method public float getDismissMinDragWidthRatio();
+ method public boolean isSwipeable();
+ method public void removeCallback(androidx.wear.widget.SwipeDismissFrameLayout.Callback!);
+ method public void setDismissMinDragWidthRatio(float);
+ method public void setSwipeable(boolean);
+ field public static final float DEFAULT_DISMISS_DRAG_WIDTH_RATIO = 0.33f;
+ }
+
+ @UiThread public abstract static class SwipeDismissFrameLayout.Callback {
+ ctor public SwipeDismissFrameLayout.Callback();
+ method public void onDismissed(androidx.wear.widget.SwipeDismissFrameLayout!);
+ method public void onSwipeCanceled(androidx.wear.widget.SwipeDismissFrameLayout!);
+ method public void onSwipeStarted(androidx.wear.widget.SwipeDismissFrameLayout!);
+ }
+
+ public class WearableLinearLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+ ctor public WearableLinearLayoutManager(android.content.Context!, androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback!);
+ ctor public WearableLinearLayoutManager(android.content.Context!);
+ method public androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback? getLayoutCallback();
+ method public void setLayoutCallback(androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback?);
+ }
+
+ public abstract static class WearableLinearLayoutManager.LayoutCallback {
+ ctor public WearableLinearLayoutManager.LayoutCallback();
+ method public abstract void onLayoutFinished(android.view.View!, androidx.recyclerview.widget.RecyclerView!);
+ }
+
+ public class WearableRecyclerView extends androidx.recyclerview.widget.RecyclerView {
+ ctor public WearableRecyclerView(android.content.Context!);
+ ctor public WearableRecyclerView(android.content.Context!, android.util.AttributeSet?);
+ ctor public WearableRecyclerView(android.content.Context!, android.util.AttributeSet?, int);
+ ctor public WearableRecyclerView(android.content.Context!, android.util.AttributeSet?, int, int);
+ method public float getBezelFraction();
+ method public float getScrollDegreesPerScreen();
+ method public boolean isCircularScrollingGestureEnabled();
+ method public boolean isEdgeItemsCenteringEnabled();
+ method public void setBezelFraction(float);
+ method public void setCircularScrollingGestureEnabled(boolean);
+ method public void setEdgeItemsCenteringEnabled(boolean);
+ method public void setScrollDegreesPerScreen(float);
+ }
+
+}
+
+package androidx.wear.widget.drawer {
+
+ public class WearableActionDrawerView extends androidx.wear.widget.drawer.WearableDrawerView {
+ ctor public WearableActionDrawerView(android.content.Context!);
+ ctor public WearableActionDrawerView(android.content.Context!, android.util.AttributeSet!);
+ ctor public WearableActionDrawerView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public WearableActionDrawerView(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public android.view.Menu! getMenu();
+ method public void setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public void setTitle(CharSequence?);
+ }
+
+ public class WearableDrawerController {
+ method public void closeDrawer();
+ method public void openDrawer();
+ method public void peekDrawer();
+ }
+
+ public class WearableDrawerLayout extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingParent android.view.View.OnLayoutChangeListener {
+ ctor public WearableDrawerLayout(android.content.Context!);
+ ctor public WearableDrawerLayout(android.content.Context!, android.util.AttributeSet!);
+ ctor public WearableDrawerLayout(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public WearableDrawerLayout(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public void onFlingComplete(android.view.View!);
+ method public void onLayoutChange(android.view.View!, int, int, int, int, int, int, int, int);
+ method public void setDrawerStateCallback(androidx.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback!);
+ }
+
+ public static class WearableDrawerLayout.DrawerStateCallback {
+ ctor public WearableDrawerLayout.DrawerStateCallback();
+ method public void onDrawerClosed(androidx.wear.widget.drawer.WearableDrawerLayout!, androidx.wear.widget.drawer.WearableDrawerView!);
+ method public void onDrawerOpened(androidx.wear.widget.drawer.WearableDrawerLayout!, androidx.wear.widget.drawer.WearableDrawerView!);
+ method public void onDrawerStateChanged(androidx.wear.widget.drawer.WearableDrawerLayout!, int);
+ }
+
+ public class WearableDrawerView extends android.widget.FrameLayout {
+ ctor public WearableDrawerView(android.content.Context!);
+ ctor public WearableDrawerView(android.content.Context!, android.util.AttributeSet!);
+ ctor public WearableDrawerView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public WearableDrawerView(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public androidx.wear.widget.drawer.WearableDrawerController! getController();
+ method public android.view.View? getDrawerContent();
+ method public int getDrawerState();
+ method public boolean isAutoPeekEnabled();
+ method public boolean isClosed();
+ method public boolean isLocked();
+ method public boolean isLockedWhenClosed();
+ method public boolean isOpenOnlyAtTopEnabled();
+ method public boolean isOpened();
+ method public boolean isPeekOnScrollDownEnabled();
+ method public boolean isPeeking();
+ method public void onDrawerClosed();
+ method public void onDrawerOpened();
+ method public void onDrawerStateChanged(int);
+ method public void onPeekContainerClicked(android.view.View!);
+ method public void setDrawerContent(android.view.View?);
+ method public void setIsAutoPeekEnabled(boolean);
+ method public void setIsLocked(boolean);
+ method public void setLockedWhenClosed(boolean);
+ method public void setOpenOnlyAtTopEnabled(boolean);
+ method public void setPeekContent(android.view.View!);
+ method public void setPeekOnScrollDownEnabled(boolean);
+ field public static final int STATE_DRAGGING = 1; // 0x1
+ field public static final int STATE_IDLE = 0; // 0x0
+ field public static final int STATE_SETTLING = 2; // 0x2
+ }
+
+ public class WearableNavigationDrawerView extends androidx.wear.widget.drawer.WearableDrawerView {
+ ctor public WearableNavigationDrawerView(android.content.Context!);
+ ctor public WearableNavigationDrawerView(android.content.Context!, android.util.AttributeSet!);
+ ctor public WearableNavigationDrawerView(android.content.Context!, android.util.AttributeSet!, int);
+ ctor public WearableNavigationDrawerView(android.content.Context!, android.util.AttributeSet!, int, int);
+ method public void addOnItemSelectedListener(androidx.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener!);
+ method public int getNavigationStyle();
+ method public void removeOnItemSelectedListener(androidx.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener!);
+ method public void setAdapter(androidx.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter!);
+ method public void setCurrentItem(int, boolean);
+ field public static final int MULTI_PAGE = 1; // 0x1
+ field public static final int SINGLE_PAGE = 0; // 0x0
+ }
+
+ public static interface WearableNavigationDrawerView.OnItemSelectedListener {
+ method public void onItemSelected(int);
+ }
+
+ public abstract static class WearableNavigationDrawerView.WearableNavigationDrawerAdapter {
+ ctor public WearableNavigationDrawerView.WearableNavigationDrawerAdapter();
+ method public abstract int getCount();
+ method public abstract android.graphics.drawable.Drawable! getItemDrawable(int);
+ method public abstract CharSequence! getItemText(int);
+ method public void notifyDataSetChanged();
+ }
+
+}
+
diff --git a/wear/api/res-1.1.0-alpha01.txt b/wear/api/res-1.1.0-alpha01.txt
new file mode 100644
index 0000000..44b0b55
--- /dev/null
+++ b/wear/api/res-1.1.0-alpha01.txt
@@ -0,0 +1 @@
+style Widget_Wear_RoundSwitch
diff --git a/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java b/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java
index cb1e25f..d167488 100644
--- a/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java
+++ b/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java
@@ -229,7 +229,7 @@
*/
@MainThread
@VisibleForTesting
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public void hide() {
Animation fadeOut =
AnimationUtils.loadAnimation(mOverlayView.getContext(), android.R.anim.fade_out);
diff --git a/webkit/api/1.1.0-alpha01.txt b/webkit/api/1.1.0-alpha01.txt
index 02555f4..ec00e8f 100644
--- a/webkit/api/1.1.0-alpha01.txt
+++ b/webkit/api/1.1.0-alpha01.txt
@@ -100,9 +100,9 @@
public class WebViewClientCompat extends android.webkit.WebViewClient {
ctor public WebViewClientCompat();
- method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
+ method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
method @RequiresApi(21) public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, androidx.webkit.WebResourceErrorCompat);
- method @RequiresApi(27) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
+ method @RequiresApi(27) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
method public void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, androidx.webkit.SafeBrowsingResponseCompat);
}
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
index 02555f4..ec00e8f 100644
--- a/webkit/api/current.txt
+++ b/webkit/api/current.txt
@@ -100,9 +100,9 @@
public class WebViewClientCompat extends android.webkit.WebViewClient {
ctor public WebViewClientCompat();
- method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
+ method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError);
method @RequiresApi(21) public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, androidx.webkit.WebResourceErrorCompat);
- method @RequiresApi(27) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
+ method @RequiresApi(27) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
method public void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, androidx.webkit.SafeBrowsingResponseCompat);
}
diff --git a/webkit/build.gradle b/webkit/build.gradle
index 24fd75e..9737f08 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -30,6 +30,7 @@
androidTestImplementation(TEST_EXT_JUNIT)
androidTestImplementation(TEST_CORE)
androidTestImplementation(TEST_RUNNER)
+ androidTestImplementation(TEST_RULES)
androidTestImplementation(project(":concurrent:concurrent-futures"))
}
diff --git a/webkit/src/androidTest/AndroidManifest.xml b/webkit/src/androidTest/AndroidManifest.xml
index 1fc88bf..74a2360 100644
--- a/webkit/src/androidTest/AndroidManifest.xml
+++ b/webkit/src/androidTest/AndroidManifest.xml
@@ -23,5 +23,12 @@
<!-- Note: we must specify this because our local server uses
http://localhost URLs (and P defaults to blocking cleartext traffic).
-->
- <application android:usesCleartextTraffic="true" />
+
+ <application android:label="WebViewAssetLoaderTestIntegrationTest"
+ android:hardwareAccelerated="true"
+ android:usesCleartextTraffic="true">
+
+ <!-- Top-level Activity -->
+ <activity android:name=".WebViewAssetLoaderIntegrationTest$TestActivity"/>
+ </application>
</manifest>
diff --git a/webkit/src/androidTest/assets/www/test_with_title.html b/webkit/src/androidTest/assets/www/test_with_title.html
new file mode 100644
index 0000000..2bd9157
--- /dev/null
+++ b/webkit/src/androidTest/assets/www/test_with_title.html
@@ -0,0 +1,22 @@
+<!--
+Copyright 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<head>
+ <title>WebViewAssetLoaderTest</title>
+</head>
+
+<body>
+ <div>test</div>
+</body>
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
new file mode 100644
index 0000000..452e939
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.app.Activity;
+import android.net.Uri;
+import android.os.Bundle;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Callable;
+
+@RunWith(AndroidJUnit4.class)
+public class WebViewAssetLoaderIntegrationTest {
+ private static final String TAG = "WebViewAssetLoaderIntegrationTest";
+
+ @Rule
+ public final ActivityTestRule<TestActivity> mActivityRule =
+ new ActivityTestRule<>(TestActivity.class);
+
+ // An Activity for Integeration tests
+ public static class TestActivity extends Activity {
+ private class MyWebViewClient extends WebViewClient {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ return false;
+ }
+
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ mOnPageFinishedUrl.add(url);
+ }
+
+ @SuppressWarnings({"deprecated"})
+ @Override
+ public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
+ return mAssetLoader.shouldInterceptRequest(url);
+ }
+
+ @Override
+ public WebResourceResponse shouldInterceptRequest(WebView view,
+ WebResourceRequest request) {
+ return mAssetLoader.shouldInterceptRequest(request);
+ }
+ }
+
+ private WebViewAssetLoader mAssetLoader;
+ private WebView mWebView;
+ private ArrayBlockingQueue<String> mOnPageFinishedUrl = new ArrayBlockingQueue<String>(5);
+
+ public WebViewAssetLoader getAssetLoader() {
+ return mAssetLoader;
+
+ }
+
+ public WebView getWebView() {
+ return mWebView;
+ }
+
+ public ArrayBlockingQueue<String> getOnPageFinishedUrl() {
+ return mOnPageFinishedUrl;
+ }
+
+ private void setUpWebView(WebView view) {
+ view.setWebViewClient(new MyWebViewClient());
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mAssetLoader = new WebViewAssetLoader(this);
+ mWebView = new WebView(this);
+ setUpWebView(mWebView);
+ setContentView(mWebView);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mWebView.destroy();
+ mWebView = null;
+ }
+ }
+
+ @Test
+ @MediumTest
+ public void testAssetHosting() throws Exception {
+ final TestActivity activity = mActivityRule.getActivity();
+ final String test_with_title_path = "www/test_with_title.html";
+
+ String url = WebkitUtils.onMainThreadSync(new Callable<String>() {
+ @Override
+ public String call() {
+ WebViewAssetLoader assetLoader = activity.getAssetLoader();
+ assetLoader.hostAssets();
+ Uri.Builder testPath =
+ assetLoader.getAssetsHttpPrefix().buildUpon()
+ .appendPath(test_with_title_path);
+
+ String url = testPath.toString();
+ activity.getWebView().loadUrl(url);
+
+ return url;
+ }
+ });
+
+ String onPageFinishedUrl = activity.getOnPageFinishedUrl().take();
+ Assert.assertEquals(url, onPageFinishedUrl);
+
+ String title = WebkitUtils.onMainThreadSync(new Callable<String>() {
+ @Override
+ public String call() {
+ return activity.getWebView().getTitle();
+ }
+ });
+ Assert.assertEquals("WebViewAssetLoaderTest", title);
+ }
+
+ @Test
+ @MediumTest
+ public void testResourcesHosting() throws Exception {
+ final TestActivity activity = mActivityRule.getActivity();
+ final String test_with_title_path = "test_with_title.html";
+
+ String url = WebkitUtils.onMainThreadSync(new Callable<String>() {
+ @Override
+ public String call() {
+ WebViewAssetLoader assetLoader = activity.getAssetLoader();
+ assetLoader.hostResources();
+ Uri.Builder testPath =
+ assetLoader.getResourcesHttpPrefix().buildUpon()
+ .appendPath("raw")
+ .appendPath(test_with_title_path);
+
+ String url = testPath.toString();
+ activity.getWebView().loadUrl(url);
+
+ return url;
+ }
+ });
+
+ String onPageFinishedUrl = activity.getOnPageFinishedUrl().take();
+ Assert.assertEquals(url, onPageFinishedUrl);
+
+ String title = WebkitUtils.onMainThreadSync(new Callable<String>() {
+ @Override
+ public String call() {
+ return activity.getWebView().getTitle();
+ }
+ });
+ Assert.assertEquals("WebViewAssetLoaderTest", title);
+ }
+}
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
new file mode 100644
index 0000000..383c061
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.net.Uri;
+import android.util.Log;
+import android.webkit.WebResourceResponse;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+import androidx.webkit.internal.AssetHelper;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+
+@RunWith(AndroidJUnit4.class)
+public class WebViewAssetLoaderTest {
+ private static final String TAG = "WebViewAssetLoaderTest";
+
+ private static String readAsString(InputStream is, String encoding) throws IOException {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ byte[] buffer = new byte[512];
+ int len = 0;
+ while ((len = is.read(buffer)) != -1) {
+ os.write(buffer, 0, len);
+ }
+ return new String(os.toByteArray(), encoding);
+ }
+
+ private static class MockAssetHelper extends AssetHelper {
+ MockAssetHelper() {
+ super(null);
+ }
+
+ @Override
+ public InputStream openAsset(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public InputStream openResource(Uri uri) {
+ return null;
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testCustomPathHandler() throws Throwable {
+ WebViewAssetLoader assetLoader = new WebViewAssetLoader(new MockAssetHelper());
+ final String contents = "Some content for testing\n";
+ final String encoding = "utf-8";
+
+ assetLoader.mResourcesHandler =
+ new WebViewAssetLoader.PathHandler("appassets.androidplatform.net", "/test/",
+ true) {
+ @Override
+ public String getEncoding() {
+ return encoding;
+ }
+
+ @Override
+ public InputStream handle(Uri url) {
+ try {
+ return new ByteArrayInputStream(contents.getBytes(encoding));
+ } catch (UnsupportedEncodingException e) {
+ Log.e(TAG, "exception when creating response", e);
+ }
+ return null;
+ }
+ };
+
+ WebResourceResponse response =
+ assetLoader.shouldInterceptRequest("http://appassets.androidplatform.net/test/");
+ Assert.assertNotNull(response);
+
+ Assert.assertEquals(encoding, response.getEncoding());
+ Assert.assertEquals(contents, readAsString(response.getData(), encoding));
+
+ Assert.assertNull(assetLoader.shouldInterceptRequest("http://foo.bar/"));
+ }
+
+ @Test
+ @SmallTest
+ public void testHostAssets() throws Throwable {
+ final String testHtmlContents = "<body><div>hah</div></body>";
+
+ WebViewAssetLoader assetLoader = new WebViewAssetLoader(new MockAssetHelper() {
+ @Override
+ public InputStream openAsset(Uri url) {
+ if (url.getPath().equals("www/test.html")) {
+ try {
+ return new ByteArrayInputStream(testHtmlContents.getBytes("utf-8"));
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to open asset URL: " + url);
+ return null;
+ }
+ }
+ return null;
+ }
+ });
+
+ assetLoader.hostAssets("/assets/", true);
+ Assert.assertEquals(assetLoader.getAssetsHttpPrefix(),
+ Uri.parse("http://appassets.androidplatform.net/assets/"));
+ Assert.assertEquals(assetLoader.getAssetsHttpsPrefix(),
+ Uri.parse("https://appassets.androidplatform.net/assets/"));
+
+ WebResourceResponse response =
+ assetLoader.shouldInterceptRequest("http://appassets.androidplatform.net/assets/www/test.html");
+ Assert.assertNotNull(response);
+ Assert.assertEquals(testHtmlContents, readAsString(response.getData(), "utf-8"));
+ }
+
+ @Test
+ @SmallTest
+ public void testHostResources() throws Throwable {
+ final String testHtmlContents = "<body><div>hah</div></body>";
+
+ WebViewAssetLoader assetLoader = new WebViewAssetLoader(new MockAssetHelper() {
+ @Override
+ public InputStream openResource(Uri uri) {
+ try {
+ if (uri.getPath().equals("raw/test.html")) {
+ return new ByteArrayInputStream(testHtmlContents.getBytes("utf-8"));
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "exception when creating response", e);
+ }
+ return null;
+ }
+ });
+
+ assetLoader.hostResources("/res/", true);
+ Assert.assertEquals(assetLoader.getResourcesHttpPrefix(), Uri.parse("http://appassets.androidplatform.net/res/"));
+ Assert.assertEquals(assetLoader.getResourcesHttpsPrefix(), Uri.parse("https://appassets.androidplatform.net/res/"));
+
+ WebResourceResponse response =
+ assetLoader.shouldInterceptRequest("http://appassets.androidplatform.net/res/raw/test.html");
+ Assert.assertNotNull(response);
+ Assert.assertEquals(testHtmlContents, readAsString(response.getData(), "utf-8"));
+ }
+}
diff --git a/webkit/src/androidTest/java/androidx/webkit/internal/WebUriMatcherTest.java b/webkit/src/androidTest/java/androidx/webkit/internal/WebUriMatcherTest.java
deleted file mode 100644
index 78cd9e4..0000000
--- a/webkit/src/androidTest/java/androidx/webkit/internal/WebUriMatcherTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.net.Uri;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class WebUriMatcherTest {
-
- @Test
- @SmallTest
- public void testFullHttpUriMatching() {
- final Object pathMatch = new Object();
- WebUriMatcher<Object> matcher = new WebUriMatcher<>();
- matcher.addUri("http", "androidplatform.net", "/some/path", pathMatch);
-
- Assert.assertEquals("Failed to match the exact http path", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path")));
- Assert.assertEquals("Failed to match http path with query", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path?asd")));
- Assert.assertEquals("Failed to match http path with fragment", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path#asd")));
- Assert.assertEquals("Failed to match http path starts with a correct prefix", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path/thing")));
-
- Assert.assertNull("Incorrectly matched https path",
- matcher.match(Uri.parse("https://androidplatform.net/some/path")));
- Assert.assertNull("Incorrectly matched http path without a separating slash",
- matcher.match(Uri.parse("http://androidplatform.net/somepath")));
- Assert.assertNull("Incorrectly matched http .../some/path with .../some/paththing",
- matcher.match(Uri.parse("http://androidplatform.net/some/paththing")));
- Assert.assertNull("Incorrectly matched http with an empty path",
- matcher.match(Uri.parse("http://androidplatform.net/")));
- Assert.assertNull("Incorrectly matched http with a different prefix",
- matcher.match(Uri.parse("http://androidplatform.net/another/some/path")));
- }
-
- @Test
- @SmallTest
- public void testFullHttpsUriMatching() {
- final Object pathMatch = new Object();
- WebUriMatcher<Object> matcher = new WebUriMatcher<>();
- matcher.addUri("https", "androidplatform.net", "/some/path", pathMatch);
-
- Assert.assertEquals("Failed to match the exact https path", pathMatch,
- matcher.match(Uri.parse("https://androidplatform.net/some/path")));
- Assert.assertEquals("Failed to match https path with query", pathMatch,
- matcher.match(Uri.parse("https://androidplatform.net/some/path?asd")));
- Assert.assertEquals("Failed to match https path with fragment", pathMatch,
- matcher.match(Uri.parse("https://androidplatform.net/some/path#asd")));
- Assert.assertEquals("Failed to match https path starts with a correct prefix", pathMatch,
- matcher.match(Uri.parse("https://androidplatform.net/some/path/thing")));
-
- Assert.assertNull("Incorrectly matched http path",
- matcher.match(Uri.parse("http://androidplatform.net/some/path")));
- Assert.assertNull("Incorrectly matched https path without a separating slash",
- matcher.match(Uri.parse("https://androidplatform.net/somepath")));
- Assert.assertNull("Incorrectly matched https .../some/path with .../some/paththing",
- matcher.match(Uri.parse("https://androidplatform.net/some/paththing")));
- Assert.assertNull("Incorrectly matched https with an empty path",
- matcher.match(Uri.parse("https://androidplatform.net/")));
- Assert.assertNull("Incorrectly matched https with a different prefix",
- matcher.match(Uri.parse("https://androidplatform.net/another/some/path")));
- }
-
- @Test
- @SmallTest
- public void testHttpandHttpsUriMatching() {
- final Object pathMatch = new Object();
- WebUriMatcher<Object> matcher = new WebUriMatcher<>();
- matcher.addUri("http", "androidplatform.net", "/some/path", pathMatch);
- matcher.addUri("https", "androidplatform.net", "/some/path", pathMatch);
-
- Assert.assertEquals("Failed to match the exact http path", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path/")));
- Assert.assertEquals("Failed to match the exact https path", pathMatch,
- matcher.match(Uri.parse("https://androidplatform.net/some/path/")));
- }
-
- @Test
- @SmallTest
- public void testEmptyPathMatching() {
- final Object pathMatch = new Object();
- WebUriMatcher<Object> matcher = new WebUriMatcher<>();
- matcher.addUri("http", "androidplatform.net", "/", pathMatch);
-
- Assert.assertEquals("Failed to match the exact http path", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/")));
- Assert.assertEquals("Failed to match the exact https path", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path")));
- Assert.assertEquals("Failed to match the exact http path", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/file.ext")));
- Assert.assertEquals("Failed to match the exact https path", pathMatch,
- matcher.match(Uri.parse("http://androidplatform.net/some/path/file.ext")));
- }
-
- @Test
- @SmallTest
- public void testManyUriMatchers() {
- final Object pathMatch1 = new Object();
- final Object pathMatch2 = new Object();
- WebUriMatcher<Object> matcher = new WebUriMatcher<>();
- matcher.addUri("http", "androidplatform.net", "/some/path_", pathMatch1);
- matcher.addUri("http", "androidplatform.net", "/some/path_2", pathMatch2);
-
- Assert.assertEquals("Failed to match the exact http .../some/path_", pathMatch1,
- matcher.match(Uri.parse("http://androidplatform.net/some/path_")));
- Assert.assertEquals("Failed to match the exact http .../some/path_2", pathMatch2,
- matcher.match(Uri.parse("http://androidplatform.net/some/path_2")));
- Assert.assertNull("Incorrectly matched a non registered path prefix .../some/path_1",
- matcher.match(Uri.parse("http://androidplatform.net/some/path_1")));
- }
-}
diff --git a/webkit/src/androidTest/res/raw/test_with_title.html b/webkit/src/androidTest/res/raw/test_with_title.html
new file mode 100644
index 0000000..2bd9157
--- /dev/null
+++ b/webkit/src/androidTest/res/raw/test_with_title.html
@@ -0,0 +1,22 @@
+<!--
+Copyright 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<head>
+ <title>WebViewAssetLoaderTest</title>
+</head>
+
+<body>
+ <div>test</div>
+</body>
diff --git a/webkit/src/main/java/androidx/webkit/ProxyConfig.java b/webkit/src/main/java/androidx/webkit/ProxyConfig.java
index 3d09ffc..4f42391 100644
--- a/webkit/src/main/java/androidx/webkit/ProxyConfig.java
+++ b/webkit/src/main/java/androidx/webkit/ProxyConfig.java
@@ -41,7 +41,7 @@
* TODO(laisminchillo): unhide this when we're ready to expose this
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ProxyConfig {
/**
* Connect to URLs directly instead of using a proxy server.
@@ -60,7 +60,7 @@
*/
public static final String MATCH_ALL_SCHEMES = "*";
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@StringDef({HTTP, HTTPS, MATCH_ALL_SCHEMES})
public @interface ProxyScheme {}
private static final String BYPASS_RULE_LOCAL = "<local>";
@@ -72,7 +72,7 @@
/**
* @hide Internal use only
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public ProxyConfig(String[][] proxyRules, String[] bypassRules) {
mProxyRules = proxyRules;
mBypassRules = bypassRules;
@@ -81,7 +81,7 @@
/**
* @hide Internal use only
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@NonNull
public String[][] proxyRules() {
return mProxyRules;
@@ -90,7 +90,7 @@
/**
* @hide Internal use only
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@NonNull
public String[] bypassRules() {
return mBypassRules;
diff --git a/webkit/src/main/java/androidx/webkit/ProxyController.java b/webkit/src/main/java/androidx/webkit/ProxyController.java
index a7bb6a18..14892fe 100644
--- a/webkit/src/main/java/androidx/webkit/ProxyController.java
+++ b/webkit/src/main/java/androidx/webkit/ProxyController.java
@@ -53,12 +53,12 @@
* TODO(laisminchillo): unhide this when we're ready to expose this
* @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract class ProxyController {
/**
* @hide Don't allow apps to sub-class this class.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public ProxyController() {}
/**
diff --git a/webkit/src/main/java/androidx/webkit/SafeBrowsingResponseCompat.java b/webkit/src/main/java/androidx/webkit/SafeBrowsingResponseCompat.java
index de191b8..61e760f 100644
--- a/webkit/src/main/java/androidx/webkit/SafeBrowsingResponseCompat.java
+++ b/webkit/src/main/java/androidx/webkit/SafeBrowsingResponseCompat.java
@@ -71,7 +71,7 @@
* This class cannot be created by applications.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public SafeBrowsingResponseCompat() {
}
}
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
index c78d709..ed50725 100644
--- a/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerControllerCompat.java
@@ -43,7 +43,7 @@
*
* @hide Don't allow apps to sub-class this class.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public ServiceWorkerControllerCompat() {}
/**
diff --git a/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.java b/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.java
index 63bbbb6..09e7bd2 100644
--- a/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.java
+++ b/webkit/src/main/java/androidx/webkit/ServiceWorkerWebSettingsCompat.java
@@ -35,11 +35,11 @@
/**
* @hide Don't allow apps to sub-class this class.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public ServiceWorkerWebSettingsCompat() {}
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@IntDef(value = {
WebSettings.LOAD_DEFAULT,
WebSettings.LOAD_CACHE_ELSE_NETWORK,
diff --git a/webkit/src/main/java/androidx/webkit/TracingConfig.java b/webkit/src/main/java/androidx/webkit/TracingConfig.java
index 9b03ea0..0a22ae3 100644
--- a/webkit/src/main/java/androidx/webkit/TracingConfig.java
+++ b/webkit/src/main/java/androidx/webkit/TracingConfig.java
@@ -35,7 +35,7 @@
*/
public class TracingConfig {
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@IntDef(flag = true, value = {CATEGORIES_NONE, CATEGORIES_ALL, CATEGORIES_ANDROID_WEBVIEW,
CATEGORIES_WEB_DEVELOPER, CATEGORIES_INPUT_LATENCY, CATEGORIES_RENDERING,
CATEGORIES_JAVASCRIPT_AND_RENDERING, CATEGORIES_FRAME_VIEWER})
@@ -97,7 +97,7 @@
android.webkit.TracingConfig.CATEGORIES_FRAME_VIEWER;
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@IntDef({RECORD_UNTIL_FULL, RECORD_CONTINUOUSLY})
@Retention(RetentionPolicy.SOURCE)
public @interface TracingMode {}
@@ -124,7 +124,7 @@
private @TracingMode int mTracingMode;
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public TracingConfig(@PredefinedCategories int predefinedCategories,
List<String> customIncludedCategories, @TracingMode int tracingMode) {
mPredefinedCategories = predefinedCategories;
diff --git a/webkit/src/main/java/androidx/webkit/TracingController.java b/webkit/src/main/java/androidx/webkit/TracingController.java
index f47b75f..72dd984 100644
--- a/webkit/src/main/java/androidx/webkit/TracingController.java
+++ b/webkit/src/main/java/androidx/webkit/TracingController.java
@@ -52,7 +52,7 @@
*
* @hide Don't allow apps to sub-class this class.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public TracingController() {}
/**
diff --git a/webkit/src/main/java/androidx/webkit/WebMessagePortCompat.java b/webkit/src/main/java/androidx/webkit/WebMessagePortCompat.java
index c314a9b5..ee21b1e 100644
--- a/webkit/src/main/java/androidx/webkit/WebMessagePortCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebMessagePortCompat.java
@@ -83,7 +83,7 @@
/**
* @hide disallow app devs to extend this class.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public WebMessagePortCompat() { }
/**
@@ -152,7 +152,7 @@
* @hide
*/
@RequiresApi(23)
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract WebMessagePort getFrameworkPort();
/**
@@ -161,7 +161,7 @@
* the WebView APK supports {@link WebMessagePortCompat}.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public abstract InvocationHandler getInvocationHandler();
}
diff --git a/webkit/src/main/java/androidx/webkit/WebResourceErrorCompat.java b/webkit/src/main/java/androidx/webkit/WebResourceErrorCompat.java
index df9c857..080f4f1 100644
--- a/webkit/src/main/java/androidx/webkit/WebResourceErrorCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebResourceErrorCompat.java
@@ -32,7 +32,7 @@
*/
public abstract class WebResourceErrorCompat {
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@IntDef(value = {
WebViewClient.ERROR_UNKNOWN,
WebViewClient.ERROR_HOST_LOOKUP,
@@ -89,7 +89,7 @@
* This class cannot be created by applications.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public WebResourceErrorCompat() {
}
}
diff --git a/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java b/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
index 05a04c1..59e2647 100644
--- a/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebSettingsCompat.java
@@ -160,7 +160,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@IntDef(flag = true, value = {
WebSettings.MENU_ITEM_NONE,
WebSettings.MENU_ITEM_SHARE,
diff --git a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
new file mode 100644
index 0000000..31c267b
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
@@ -0,0 +1,472 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.content.Context;
+import android.net.Uri;
+import android.util.Log;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
+import androidx.webkit.internal.AssetHelper;
+
+import java.io.InputStream;
+import java.net.URLConnection;
+
+/**
+ * Helper class meant to be used with the android.webkit.WebView class to enable hosting assets,
+ * resources and other data on 'virtual' http(s):// URL.
+ * Hosting assets and resources on http(s):// URLs is desirable as it is compatible with the
+ * Same-Origin policy.
+ *
+ * This class is intended to be used from within the
+ * {@link android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView,
+ * android.webkit.WebResourceRequest)}
+ * methods.
+ * <pre>
+ * WebViewAssetLoader assetLoader = new WebViewAssetLoader(this);
+ * // For security WebViewAssetLoader uses a unique subdomain by default.
+ * assetLoader.hostAssets();
+ * webView.setWebViewClient(new WebViewClient() {
+ * @Override
+ * public WebResourceResponse shouldInterceptRequest(WebView view,
+ * WebResourceRequest request) {
+ * return assetLoader.shouldInterceptRequest(request);
+ * }
+ * });
+ * // If your application's assets are in the "main/assets" folder this will read the file
+ * // from "main/assets/www/index.html" and load it as if it were hosted on:
+ * // https://appassets.androidplatform.net/assets/www/index.html
+ * assetLoader.hostAssets();
+ * webview.loadUrl(assetLoader.getAssetsHttpsPrefix().buildUpon().appendPath("www/index.html")
+ * .build().toString());
+ *
+ * </pre>
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+public class WebViewAssetLoader {
+ private static final String TAG = "WebViewAssetLoader";
+
+ /**
+ * Using http(s):// URL to access local resources may conflict with a real website. This means
+ * that local resources should only be hosted on domains that the user has control of or which
+ * have been dedicated for this purpose.
+ *
+ * The androidplatform.net domain currently belongs to Google and has been reserved for the
+ * purpose of Android applications intercepting navigations/requests directed there. It'll be
+ * used by default unless the user specified a different domain.
+ *
+ * A subdomain "appassets" will be used to even make sure no such collisons would happen.
+ */
+ public static final String KNOWN_UNUSED_AUTHORITY = "appassets.androidplatform.net";
+
+ private static final String HTTP_SCHEME = "http";
+ private static final String HTTPS_SCHEME = "https";
+
+ @NonNull final AssetHelper mAssetHelper;
+ @Nullable @VisibleForTesting PathHandler mAssetsHandler;
+ @Nullable @VisibleForTesting PathHandler mResourcesHandler;
+
+ /**
+ * A handler that produces responses for the registered paths.
+ *
+ * Methods of this handler will be invoked on a background thread and care must be taken to
+ * correctly synchronize access to any shared state.
+ *
+ * On Android KitKat and above these methods may be called on more than one thread. This thread
+ * may be different than the thread on which the shouldInterceptRequest method was invoked.
+ * This means that on Android KitKat and above it is possible to block in this method without
+ * blocking other resources from loading. The number of threads used to parallelize loading
+ * is an internal implementation detail of the WebView and may change between updates which
+ * means that the amount of time spent blocking in this method should be kept to an absolute
+ * minimum.
+ */
+ @VisibleForTesting
+ /*package*/ abstract static class PathHandler {
+ @Nullable private String mMimeType;
+ @Nullable private String mEncoding;
+
+ final boolean mHttpEnabled;
+ @NonNull final String mAuthority;
+ @NonNull final String mPath;
+
+ /**
+ * Add a URI to match, and the handler to return when this URI is
+ * matched. Matches URIs on the form: "scheme://authority/path/**"
+ *
+ * @param authority the authority to match (For example example.com)
+ * @param path the prefix path to match. Should start and end with a slash "/".
+ * @param httpEnabled whether to enable hosting using the http scheme.
+ */
+ PathHandler(@NonNull final String authority, @NonNull final String path,
+ boolean httpEnabled) {
+ if (path.isEmpty() || path.charAt(0) != '/') {
+ throw new IllegalArgumentException("Path should start with a slash '/'.");
+ }
+ if (!path.endsWith("/")) {
+ throw new IllegalArgumentException("Path should end with a slash '/'");
+ }
+ this.mMimeType = null;
+ this.mEncoding = null;
+ this.mAuthority = authority;
+ this.mPath = path;
+ this.mHttpEnabled = httpEnabled;
+ }
+
+ @Nullable
+ public abstract InputStream handle(@NonNull Uri url);
+
+ /**
+ * Match happens when:
+ * - Scheme is "https" or the scheme is "http" and http is enabled.
+ * - AND authority exact matches the given URI's authority.
+ * - AND path is a prefix of the given URI's path.
+ * @param uri The URI whose path we will match against.
+ *
+ * @return true if match happens, false otherwise.
+ */
+ @Nullable
+ public boolean match(@NonNull Uri uri) {
+ // Only match HTTP_SCHEME if caller enabled HTTP matches.
+ if (uri.getScheme().equals(HTTP_SCHEME) && !mHttpEnabled) {
+ return false;
+ }
+ // Don't match non-HTTP(S) schemes.
+ if (!uri.getScheme().equals(HTTP_SCHEME) && !uri.getScheme().equals(HTTPS_SCHEME)) {
+ return false;
+ }
+ if (!uri.getAuthority().equals(mAuthority)) {
+ return false;
+ }
+ return uri.getPath().startsWith(mPath);
+ }
+
+ @Nullable
+ public String getMimeType() {
+ return mMimeType;
+ }
+
+ @Nullable
+ public String getEncoding() {
+ return mEncoding;
+ }
+
+ void setMimeType(@Nullable String mimeType) {
+ mMimeType = mimeType;
+ }
+
+ void setEncoding(@Nullable String encoding) {
+ mEncoding = encoding;
+ }
+ }
+
+ @VisibleForTesting
+ /*package*/ WebViewAssetLoader(@NonNull AssetHelper assetHelper) {
+ this.mAssetHelper = assetHelper;
+ }
+
+ /**
+ * Creates a new instance of the WebView asset loader.
+ * Will use a default domain on the form of: appassets.androidplatform.net
+ *
+ * @param context context used to resolve resources/assets.
+ */
+ public WebViewAssetLoader(@NonNull Context context) {
+ this(new AssetHelper(context.getApplicationContext()));
+ }
+
+ @Nullable
+ private static Uri parseAndVerifyUrl(@Nullable String url) {
+ if (url == null) {
+ return null;
+ }
+ Uri uri = Uri.parse(url);
+ if (uri == null) {
+ Log.e(TAG, "Malformed URL: " + url);
+ return null;
+ }
+ String path = uri.getPath();
+ if (path == null || path.length() == 0) {
+ Log.e(TAG, "URL does not have a path: " + url);
+ return null;
+ }
+ return uri;
+ }
+
+ /**
+ * Attempt to retrieve the WebResourceResponse associated with the given <code>request</code>.
+ * This method should be invoked from within
+ * {@link android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView,
+ * android.webkit.WebResourceRequest)}.
+ *
+ * @param request the request to process.
+ * @return a response if the request URL had a matching registered url, null otherwise.
+ */
+ @RequiresApi(21)
+ @Nullable
+ public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
+ PathHandler handler;
+
+ if (mAssetsHandler != null && mAssetsHandler.match(request.getUrl())) {
+ handler = mAssetsHandler;
+ } else if (mResourcesHandler != null && mResourcesHandler.match(request.getUrl())) {
+ handler = mResourcesHandler;
+ } else {
+ return null;
+ }
+
+ InputStream is = handler.handle(request.getUrl());
+ return new WebResourceResponse(handler.getMimeType(), handler.getEncoding(), is);
+ }
+
+ /**
+ * Attempt to retrieve the WebResourceResponse associated with the given <code>url</code>.
+ * This method should be invoked from within
+ * {@link android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView, String)}.
+ *
+ * @param url the url to process.
+ * @return a response if the request URL had a matching registered url, null otherwise.
+ */
+ @Nullable
+ public WebResourceResponse shouldInterceptRequest(@Nullable String url) {
+ PathHandler handler = null;
+ Uri uri = parseAndVerifyUrl(url);
+ if (uri == null) {
+ return null;
+ }
+
+ if (mAssetsHandler != null && mAssetsHandler.match(uri)) {
+ handler = mAssetsHandler;
+ } else if (mResourcesHandler != null && mResourcesHandler.match(uri)) {
+ handler = mResourcesHandler;
+ } else {
+ return null;
+ }
+
+ InputStream is = handler.handle(uri);
+ return new WebResourceResponse(handler.getMimeType(), handler.getEncoding(), is);
+ }
+
+ /**
+ * Hosts the application's assets on an http(s):// URL. It will be available under
+ * <code>http(s)://appassets.androidplatform.net/assets/...</code>.
+ */
+ @NonNull
+ public void hostAssets() {
+ hostAssets(KNOWN_UNUSED_AUTHORITY, "/assets/", true);
+ }
+
+ /**
+ * Hosts the application's assets on an http(s):// URL. It will be available under
+ * <code>http(s)://appassets.androidplatform.net/{virtualAssetPath}/...</code>.
+ *
+ * @param virtualAssetPath the virtual path under which the assets should be hosted. Should
+ * have a leading and trailing slash (for example "/assets/www/").
+ * @param enableHttp whether to enable hosting using the http scheme.
+ */
+ @NonNull
+ public void hostAssets(@NonNull final String virtualAssetPath, boolean enableHttp) {
+ hostAssets(KNOWN_UNUSED_AUTHORITY, virtualAssetPath, enableHttp);
+ }
+
+ /**
+ * Hosts the application's assets on an http(s):// URL. It will be available under
+ * <code>http(s)://{domain}/{virtualAssetPath}/...</code>.
+ *
+ * @param domain custom domain on which the assets should be hosted (for example "example.com").
+ * * @param virtualAssetPath the virtual path under which the assets should be hosted. Should
+ * have a leading and trailing slash (for example "/assets/www/").
+ * @param enableHttp whether to enable hosting using the http scheme.
+ */
+ @NonNull
+ public void hostAssets(@NonNull final String domain, @NonNull final String virtualAssetPath,
+ boolean enableHttp) {
+ final Uri uriPrefix = createUriPrefix(domain, virtualAssetPath);
+
+ mAssetsHandler = new PathHandler(uriPrefix.getAuthority(), uriPrefix.getPath(),
+ enableHttp) {
+ @Override
+ public InputStream handle(Uri url) {
+ String path = url.getPath().replaceFirst(this.mPath, "");
+ Uri.Builder assetUriBuilder = new Uri.Builder();
+ assetUriBuilder.path(path);
+ Uri assetUri = assetUriBuilder.build();
+
+ InputStream stream = mAssetHelper.openAsset(assetUri);
+ this.setMimeType(URLConnection.guessContentTypeFromName(assetUri.getPath()));
+
+ return stream;
+ }
+ };
+ }
+
+ /**
+ * Hosts the application's resources on an http(s):// URL. Resources
+ * <code>http(s)://appassets.androidplatform.net/res/{resource_type}/{resource_name}</code>.
+ */
+ @NonNull
+ public void hostResources() {
+ hostResources(KNOWN_UNUSED_AUTHORITY, "/res/", true);
+ }
+
+ /**
+ * Hosts the application's resources on an http(s):// URL. Resources
+ * <code>http(s)://appassets.androidplatform.net/{virtualResourcesPath}/
+ * {resource_type}/{resource_name}</code>.
+ *
+ * @param virtualResourcesPath the virtual path under which the assets should be hosted. Should
+ * have a leading and trailing slash (for example "/resources/").
+ * @param enableHttp whether to enable hosting using the http scheme.
+ */
+ @NonNull
+ public void hostResources(@NonNull final String virtualResourcesPath, boolean enableHttp) {
+ hostResources(KNOWN_UNUSED_AUTHORITY, virtualResourcesPath, enableHttp);
+ }
+
+ /**
+ * Hosts the application's resources on an http(s):// URL. Resources
+ * <code>http(s)://{domain}/{virtualResourcesPath}/{resource_type}/{resource_name}</code>.
+ *
+ * @param domain custom domain on which the assets should be hosted (for example "example.com").
+ * @param virtualResourcesPath the virtual path under which the assets should be hosted. Should
+ * have a leading and trailing slash (for example "/resources/").
+ * @param enableHttp whether to enable hosting using the http scheme.
+ */
+ @NonNull
+ public void hostResources(@NonNull final String domain,
+ @NonNull final String virtualResourcesPath,
+ boolean enableHttp) {
+ final Uri uriPrefix = createUriPrefix(domain, virtualResourcesPath);
+
+ mResourcesHandler = new PathHandler(uriPrefix.getAuthority(), uriPrefix.getPath(),
+ enableHttp) {
+ @Override
+ public InputStream handle(Uri url) {
+ String path = url.getPath().replaceFirst(uriPrefix.getPath(), "");
+ Uri.Builder resourceUriBuilder = new Uri.Builder();
+ resourceUriBuilder.path(path);
+ Uri resourceUri = resourceUriBuilder.build();
+
+ InputStream stream = mAssetHelper.openResource(resourceUri);
+ this.setMimeType(URLConnection.guessContentTypeFromName(resourceUri.getPath()));
+
+ return stream;
+ }
+ };
+ }
+
+ @NonNull
+ private static Uri createUriPrefix(@NonNull String domain, @NonNull String virtualPath) {
+ if (virtualPath.indexOf('*') != -1) {
+ throw new IllegalArgumentException(
+ "virtualPath cannot contain the '*' character.");
+ }
+ if (virtualPath.isEmpty() || virtualPath.charAt(0) != '/') {
+ throw new IllegalArgumentException(
+ "virtualPath should start with a slash '/'.");
+ }
+ if (!virtualPath.endsWith("/")) {
+ throw new IllegalArgumentException(
+ "virtualPath should end with a slash '/'.");
+ }
+
+ Uri.Builder uriBuilder = new Uri.Builder();
+ uriBuilder.authority(domain);
+ uriBuilder.path(virtualPath);
+
+ return uriBuilder.build();
+ }
+
+ /**
+ * Gets the http: scheme prefix at which assets are hosted.
+ * @return the http: scheme prefix at which assets are hosted. Can return null.
+ */
+ @Nullable
+ public Uri getAssetsHttpPrefix() {
+ if (mAssetsHandler == null || !mAssetsHandler.mHttpEnabled) {
+ return null;
+ }
+
+ Uri.Builder uriBuilder = new Uri.Builder();
+ uriBuilder.authority(mAssetsHandler.mAuthority);
+ uriBuilder.path(mAssetsHandler.mPath);
+ uriBuilder.scheme(HTTP_SCHEME);
+
+ return uriBuilder.build();
+ }
+
+ /**
+ * Gets the https: scheme prefix at which assets are hosted.
+ * @return the https: scheme prefix at which assets are hosted. Can return null.
+ */
+ @Nullable
+ public Uri getAssetsHttpsPrefix() {
+ if (mAssetsHandler == null) {
+ return null;
+ }
+
+ Uri.Builder uriBuilder = new Uri.Builder();
+ uriBuilder.authority(mAssetsHandler.mAuthority);
+ uriBuilder.path(mAssetsHandler.mPath);
+ uriBuilder.scheme(HTTPS_SCHEME);
+
+ return uriBuilder.build();
+ }
+
+ /**
+ * Gets the http: scheme prefix at which resources are hosted.
+ * @return the http: scheme prefix at which resources are hosted. Can return null.
+ */
+ @Nullable
+ public Uri getResourcesHttpPrefix() {
+ if (mResourcesHandler == null || !mResourcesHandler.mHttpEnabled) {
+ return null;
+ }
+
+ Uri.Builder uriBuilder = new Uri.Builder();
+ uriBuilder.authority(mResourcesHandler.mAuthority);
+ uriBuilder.path(mResourcesHandler.mPath);
+ uriBuilder.scheme(HTTP_SCHEME);
+
+ return uriBuilder.build();
+ }
+
+ /**
+ * Gets the https: scheme prefix at which resources are hosted.
+ * @return the https: scheme prefix at which resources are hosted. Can return null.
+ */
+ @Nullable
+ public Uri getResourcesHttpsPrefix() {
+ if (mResourcesHandler == null) {
+ return null;
+ }
+
+ Uri.Builder uriBuilder = new Uri.Builder();
+ uriBuilder.authority(mResourcesHandler.mAuthority);
+ uriBuilder.path(mResourcesHandler.mPath);
+ uriBuilder.scheme(HTTPS_SCHEME);
+
+ return uriBuilder.build();
+ }
+}
diff --git a/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java b/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java
index e253a42..36b1e7c 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewClientCompat.java
@@ -56,7 +56,7 @@
};
/** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@IntDef(value = {
WebViewClient.SAFE_BROWSING_THREAT_UNKNOWN,
WebViewClient.SAFE_BROWSING_THREAT_MALWARE,
@@ -73,7 +73,7 @@
* @hide
*/
@Override
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public final String[] getSupportedFeatures() {
return sSupportedFeatures;
}
@@ -120,7 +120,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
@RequiresApi(21)
public final void onReceivedError(@NonNull WebView view, @NonNull WebResourceRequest request,
@@ -131,11 +131,12 @@
/**
* Applications are not meant to override this, and should instead override the non-final {@link
* #onReceivedError(WebView, WebResourceRequest, WebResourceErrorCompat)} method.
+ * @hide
*/
// Invoked by chromium (in legacy, pre-67 WebView APKs) for the {@code onReceivedError} event on
// {@link Build.VERSION_CODES.M} and above. This delegates the callback to the non-final method,
// which the app may have overridden.
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
@RequiresApi(23)
public final void onReceivedError(@NonNull WebView view, @NonNull WebResourceRequest request,
@@ -203,7 +204,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public final void onSafeBrowsingHit(@NonNull WebView view, @NonNull WebResourceRequest request,
@SafeBrowsingThreat int threatType,
@@ -214,11 +215,12 @@
/**
* Applications are not meant to override this, and should instead override the non-final {@link
* #onSafeBrowsingHit(WebView, WebResourceRequest, int, SafeBrowsingResponseCompat)} method.
+ * @hide
*/
// Invoked by chromium (in legacy, pre-67 WebView APKs) for the {@code onSafeBrowsingHit} event
// on {@link Build.VERSION_CODES.O_MR1} and above. This delegates the callback to the non-final
// method, which the app may have overridden.
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
@RequiresApi(27)
public final void onSafeBrowsingHit(@NonNull WebView view, @NonNull WebResourceRequest request,
diff --git a/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index ec5f77f..9fa1d36 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -50,7 +50,7 @@
/**
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@StringDef(value = {
VISUAL_STATE_CALLBACK,
OFF_SCREEN_PRERASTER,
@@ -385,7 +385,7 @@
* TODO(laisminchillo): unhide this when we're ready to expose this
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public static final String PROXY_OVERRIDE = Features.PROXY_OVERRIDE;
/**
diff --git a/webkit/src/main/java/androidx/webkit/WebViewRenderer.java b/webkit/src/main/java/androidx/webkit/WebViewRenderer.java
index 70cff54..6b5d264 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewRenderer.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewRenderer.java
@@ -47,7 +47,7 @@
* This class cannot be created by applications.
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public WebViewRenderer() {
}
}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebUriMatcher.java b/webkit/src/main/java/androidx/webkit/internal/WebUriMatcher.java
deleted file mode 100644
index a4b78e9..0000000
--- a/webkit/src/main/java/androidx/webkit/internal/WebUriMatcher.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.net.Uri;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-
-/**
- * Utility class to aid in matching URIs. Supports matching scheme, authority, and path prefix.
- *
- * @param <T> handler Class returned when a match occurs.
- */
-public class WebUriMatcher<T> {
- @NonNull private ArrayList<MatcherValues> mMatchers;
-
- public WebUriMatcher() {
- mMatchers = new ArrayList<>();
- }
-
- private class MatcherValues {
- @NonNull final String mScheme;
- @NonNull final String mAuthority;
- @NonNull final String mPath;
- @NonNull final T mHandler;
-
- MatcherValues(@NonNull final String scheme, @NonNull final String authority,
- @NonNull final String path, @NonNull final T handler) {
- mScheme = scheme;
- mAuthority = authority;
- mPath = path;
- mHandler = handler;
- }
- }
-
- /**
- * Add a URI to match, and the handler to return when this URI is
- * matched. Matches URIs on the form: "scheme://authority/path/**"
- *
- * @param scheme the scheme (http/https) to match
- * @param authority the authority to match (For example example.com)
- * @param path the prefix path to match. Should start with a slash "/".
- * @param handler the handler that is returned when a URI is matched
- * against the given components.
- */
- @NonNull
- public void addUri(@NonNull final String scheme, @NonNull final String authority,
- @NonNull final String path, @NonNull final T handler) {
- if (path.isEmpty()) {
- throw new IllegalArgumentException("Path cannot be empty");
- }
- if (!path.startsWith("/")) {
- throw new IllegalArgumentException("Path should always start with a slash \"/\"");
- }
- mMatchers.add(new MatcherValues(scheme, authority, path, handler));
- }
-
- /**
- * Try to matches the URI against registered matchers. Match happens when:
- * - Scheme exact matches the given URI's scheme.
- * - Authority exact matches the given URI's authority.
- * - Path is a prefix of the given URI's path.
- * @param uri The URI whose path we will match against.
- *
- * @return The handler for the matched node (added using addUri),
- * or {@code null} if there is no matched node.
- */
- @Nullable
- public T match(@NonNull Uri uri) {
- for (MatcherValues matcher : mMatchers) {
- if (uri.getScheme().equals(matcher.mScheme)
- && uri.getAuthority().equals(matcher.mAuthority)
- && matchPath(matcher.mPath, uri.getPath())) {
- return matcher.mHandler;
- }
- }
-
- return null;
- }
-
- private static boolean matchPath(String prefix, String path) {
- if (path.equals(prefix)) {
- return true;
- }
- if (!prefix.endsWith("/")) {
- prefix = prefix + "/";
- }
- return path.startsWith(prefix);
- }
-}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewRendererClientAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewRendererClientAdapter.java
index 3537017..d100de5 100644
--- a/webkit/src/main/java/androidx/webkit/internal/WebViewRendererClientAdapter.java
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewRendererClientAdapter.java
@@ -52,7 +52,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public final String[] getSupportedFeatures() {
return sSupportedFeatures;
@@ -64,7 +64,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public final void onRendererUnresponsive(
@NonNull final WebView view,
@@ -89,7 +89,7 @@
*
* @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
@Override
public final void onRendererResponsive(
@NonNull final WebView view,
diff --git a/webkit/src/main/java/androidx/webkit/internal/package-info.java b/webkit/src/main/java/androidx/webkit/internal/package-info.java
index 66ab2d9..14925653 100644
--- a/webkit/src/main/java/androidx/webkit/internal/package-info.java
+++ b/webkit/src/main/java/androidx/webkit/internal/package-info.java
@@ -17,9 +17,9 @@
/**
* @hide
*/
-@RestrictTo(LIBRARY_GROUP)
+@RestrictTo(LIBRARY_GROUP_PREFIX)
package androidx.webkit.internal;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import androidx.annotation.RestrictTo;
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
index a30c76d..fa79f17 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
@@ -187,6 +187,23 @@
}
});
+ findViewById(R.id.enqueue_periodic_work_flex).setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Data input = new Data.Builder()
+ .putString(ToastWorker.ARG_MESSAGE, "Periodic work with Flex")
+ .build();
+ PeriodicWorkRequest request =
+ new PeriodicWorkRequest.Builder(ToastWorker.class, 15,
+ TimeUnit.MINUTES, 10,
+ TimeUnit.MINUTES)
+ .setInputData(input)
+ .build();
+ WorkManager.getInstance().enqueue(request);
+ }
+ });
+
findViewById(R.id.begin_unique_work_loop)
.setOnClickListener(new View.OnClickListener() {
@Override
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java
index c35900d..2fada74 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java
@@ -27,10 +27,13 @@
import androidx.work.Worker;
import androidx.work.WorkerParameters;
+import java.util.Date;
+
/**
* A {@link Worker} that shows a given Toast.
*/
public class ToastWorker extends Worker {
+ private static final String TAG = "WM-ToastWorker";
static final String ARG_MESSAGE = "message";
/**
@@ -55,6 +58,8 @@
if (message == null) {
message = "completed!";
}
+ final Date now = new Date(System.currentTimeMillis());
+ Log.i(TAG, String.format("Run time [%s]: %s", message, now));
final String displayMessage = message;
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
diff --git a/work/integration-tests/testapp/src/main/res/layout/activity_main.xml b/work/integration-tests/testapp/src/main/res/layout/activity_main.xml
index 2294762..1da89a0 100644
--- a/work/integration-tests/testapp/src/main/res/layout/activity_main.xml
+++ b/work/integration-tests/testapp/src/main/res/layout/activity_main.xml
@@ -127,6 +127,14 @@
android:id="@+id/enqueue_periodic_work"
android:layout_marginTop="12dp"/>
+ <Button android:text="@string/enqueue_periodic_work_flex"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
+ android:id="@+id/enqueue_periodic_work_flex"
+ android:layout_marginTop="12dp"/>
+
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/work/integration-tests/testapp/src/main/res/values/strings.xml b/work/integration-tests/testapp/src/main/res/values/strings.xml
index 91189fa..e836218 100644
--- a/work/integration-tests/testapp/src/main/res/values/strings.xml
+++ b/work/integration-tests/testapp/src/main/res/values/strings.xml
@@ -17,6 +17,7 @@
<resources>
<string name="analyze_holmes">Analyze Sherlock Holmes!</string>
<string name="enqueue_periodic_work">Enqueue Periodic Work</string>
+ <string name="enqueue_periodic_work_flex">Enqueue Periodic Work (with Flex)</string>
<string name="loop_unique_work">Loop Unique Work</string>
<string name="enqueue_lots_of_work">Add Lots of Work</string>
<string name="exploding_work">Test Exploding Work</string>
diff --git a/work/workmanager-ktx/api/1.0.0-rc01.txt b/work/workmanager-ktx/api/1.0.0-rc01.txt
new file mode 100644
index 0000000..d76133a
--- /dev/null
+++ b/work/workmanager-ktx/api/1.0.0-rc01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object? doWork(kotlin.coroutines.experimental.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder! OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.experimental.Continuation<? super androidx.work.Operation.State.SUCCESS>! p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit! repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration! repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit! repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit! flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration! repeatInterval, java.time.Duration! flexTimeInterval);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/work/workmanager-ktx/api/res-1.0.0-rc01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to work/workmanager-ktx/api/res-1.0.0-rc01.txt
diff --git a/work/workmanager-rxjava2/api/1.0.0-rc01.txt b/work/workmanager-rxjava2/api/1.0.0-rc01.txt
new file mode 100644
index 0000000..fc1c405
--- /dev/null
+++ b/work/workmanager-rxjava2/api/1.0.0-rc01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result>! createWork();
+ method protected io.reactivex.Scheduler! getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/work/workmanager-rxjava2/api/res-1.0.0-rc01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to work/workmanager-rxjava2/api/res-1.0.0-rc01.txt
diff --git a/work/workmanager-testing/api/1.0.0-rc01.txt b/work/workmanager-testing/api/1.0.0-rc01.txt
new file mode 100644
index 0000000..4754b0d
--- /dev/null
+++ b/work/workmanager-testing/api/1.0.0-rc01.txt
@@ -0,0 +1,22 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method public static androidx.work.testing.TestDriver! getTestDriver();
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/work/workmanager-testing/api/res-1.0.0-rc01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to work/workmanager-testing/api/res-1.0.0-rc01.txt
diff --git a/work/workmanager/api/1.0.0-rc01.txt b/work/workmanager/api/1.0.0-rc01.txt
new file mode 100644
index 0000000..bc7e240
--- /dev/null
+++ b/work/workmanager/api/1.0.0-rc01.txt
@@ -0,0 +1,284 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+ ctor public ArrayCreatingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data>);
+ }
+
+ public enum BackoffPolicy {
+ enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+ enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+ }
+
+ public final class Configuration {
+ method public java.util.concurrent.Executor getExecutor();
+ method public int getMaxJobSchedulerId();
+ method public int getMinJobSchedulerId();
+ method public androidx.work.WorkerFactory getWorkerFactory();
+ field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+ }
+
+ public static final class Configuration.Builder {
+ ctor public Configuration.Builder();
+ method public androidx.work.Configuration build();
+ method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+ method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+ method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+ method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class Constraints {
+ ctor public Constraints(androidx.work.Constraints);
+ method public androidx.work.NetworkType getRequiredNetworkType();
+ method public boolean requiresBatteryNotLow();
+ method public boolean requiresCharging();
+ method @RequiresApi(23) public boolean requiresDeviceIdle();
+ method public boolean requiresStorageNotLow();
+ field public static final androidx.work.Constraints! NONE;
+ }
+
+ public static final class Constraints.Builder {
+ ctor public Constraints.Builder();
+ method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+ method public androidx.work.Constraints build();
+ method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+ method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+ method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+ method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+ method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+ }
+
+ public final class Data {
+ ctor public Data(androidx.work.Data);
+ method public boolean getBoolean(String, boolean);
+ method public boolean[]? getBooleanArray(String);
+ method public double getDouble(String, double);
+ method public double[]? getDoubleArray(String);
+ method public float getFloat(String, float);
+ method public float[]? getFloatArray(String);
+ method public int getInt(String, int);
+ method public int[]? getIntArray(String);
+ method public java.util.Map<java.lang.String,java.lang.Object> getKeyValueMap();
+ method public long getLong(String, long);
+ method public long[]? getLongArray(String);
+ method public String? getString(String);
+ method public String[]? getStringArray(String);
+ field public static final androidx.work.Data! EMPTY;
+ field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+ }
+
+ public static final class Data.Builder {
+ ctor public Data.Builder();
+ method public androidx.work.Data build();
+ method public androidx.work.Data.Builder putAll(androidx.work.Data);
+ method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String,java.lang.Object>);
+ method public androidx.work.Data.Builder putBoolean(String, boolean);
+ method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+ method public androidx.work.Data.Builder putDouble(String, double);
+ method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+ method public androidx.work.Data.Builder putFloat(String, float);
+ method public androidx.work.Data.Builder putFloatArray(String, float[]);
+ method public androidx.work.Data.Builder putInt(String, int);
+ method public androidx.work.Data.Builder putIntArray(String, int[]);
+ method public androidx.work.Data.Builder putLong(String, long);
+ method public androidx.work.Data.Builder putLongArray(String, long[]);
+ method public androidx.work.Data.Builder putString(String, String?);
+ method public androidx.work.Data.Builder putStringArray(String, String[]);
+ }
+
+ public enum ExistingPeriodicWorkPolicy {
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+ }
+
+ public enum ExistingWorkPolicy {
+ enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+ enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+ }
+
+ public abstract class InputMerger {
+ ctor public InputMerger();
+ method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data>);
+ }
+
+ public abstract class ListenableWorker {
+ ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+ method public final android.content.Context getApplicationContext();
+ method public final java.util.UUID getId();
+ method public final androidx.work.Data getInputData();
+ method @RequiresApi(28) public final android.net.Network? getNetwork();
+ method public final int getRunAttemptCount();
+ method public final java.util.Set<java.lang.String> getTags();
+ method @RequiresApi(24) public final java.util.List<java.lang.String> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public final java.util.List<android.net.Uri> getTriggeredContentUris();
+ method public final boolean isStopped();
+ method public void onStopped();
+ method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ }
+
+ public abstract static class ListenableWorker.Result {
+ method public static androidx.work.ListenableWorker.Result failure();
+ method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+ method public static androidx.work.ListenableWorker.Result retry();
+ method public static androidx.work.ListenableWorker.Result success();
+ method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+ }
+
+ public enum NetworkType {
+ enum_constant public static final androidx.work.NetworkType CONNECTED;
+ enum_constant public static final androidx.work.NetworkType METERED;
+ enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+ enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+ enum_constant public static final androidx.work.NetworkType UNMETERED;
+ }
+
+ public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+ method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker>);
+ method public static java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<java.lang.Class<? extends androidx.work.ListenableWorker>>);
+ }
+
+ public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+ ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>);
+ method public androidx.work.OneTimeWorkRequest.Builder setInitialDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.OneTimeWorkRequest.Builder setInitialDelay(java.time.Duration);
+ method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger>);
+ }
+
+ public interface Operation {
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS> getResult();
+ method public android.arch.lifecycle.LiveData<androidx.work.Operation.State> getState();
+ }
+
+ public abstract static class Operation.State {
+ }
+
+ public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+ ctor public Operation.State.FAILURE(Throwable);
+ method public Throwable getThrowable();
+ }
+
+ public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+ }
+
+ public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+ }
+
+ public final class OverwritingInputMerger extends androidx.work.InputMerger {
+ ctor public OverwritingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data>);
+ }
+
+ public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+ field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+ field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+ }
+
+ public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration);
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration, java.time.Duration);
+ }
+
+ public abstract class WorkContinuation {
+ ctor public WorkContinuation();
+ method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation>);
+ method public abstract androidx.work.Operation enqueue();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo>> getWorkInfos();
+ method public abstract android.arch.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo>> getWorkInfosLiveData();
+ method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest>);
+ }
+
+ public final class WorkInfo {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getOutputData();
+ method public androidx.work.WorkInfo.State getState();
+ method public java.util.Set<java.lang.String> getTags();
+ }
+
+ public enum WorkInfo.State {
+ method public boolean isFinished();
+ enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+ enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+ enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+ enum_constant public static final androidx.work.WorkInfo.State FAILED;
+ enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+ enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+ }
+
+ public abstract class WorkManager {
+ method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest>);
+ method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest>);
+ method public abstract androidx.work.Operation cancelAllWork();
+ method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+ method public abstract androidx.work.Operation cancelUniqueWork(String);
+ method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+ method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+ method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+ method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+ method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest>);
+ method public static androidx.work.WorkManager getInstance();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long> getLastCancelAllTimeMillis();
+ method public abstract android.arch.lifecycle.LiveData<java.lang.Long> getLastCancelAllTimeMillisLiveData();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo> getWorkInfoById(java.util.UUID);
+ method public abstract android.arch.lifecycle.LiveData<androidx.work.WorkInfo> getWorkInfoByIdLiveData(java.util.UUID);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo>> getWorkInfosByTag(String);
+ method public abstract android.arch.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo>> getWorkInfosByTagLiveData(String);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo>> getWorkInfosForUniqueWork(String);
+ method public abstract android.arch.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo>> getWorkInfosForUniqueWorkLiveData(String);
+ method public static void initialize(android.content.Context, androidx.work.Configuration);
+ method public abstract androidx.work.Operation pruneWork();
+ }
+
+ public abstract class WorkRequest {
+ method public java.util.UUID getId();
+ field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+ field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+ field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+ }
+
+ public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder, W extends androidx.work.WorkRequest> {
+ method public final B addTag(String);
+ method public final W build();
+ method public final B keepResultsForAtLeast(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration);
+ method public final B setBackoffCriteria(androidx.work.BackoffPolicy, long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy, java.time.Duration);
+ method public final B setConstraints(androidx.work.Constraints);
+ method public final B setInputData(androidx.work.Data);
+ }
+
+ public abstract class Worker extends androidx.work.ListenableWorker {
+ ctor @Keep public Worker(android.content.Context, androidx.work.WorkerParameters);
+ method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ }
+
+ public abstract class WorkerFactory {
+ ctor public WorkerFactory();
+ method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public final class WorkerParameters {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getInputData();
+ method @RequiresApi(28) public android.net.Network? getNetwork();
+ method public int getRunAttemptCount();
+ method public java.util.Set<java.lang.String> getTags();
+ method @RequiresApi(24) public java.util.List<java.lang.String> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public java.util.List<android.net.Uri> getTriggeredContentUris();
+ }
+
+}
+
diff --git a/savedstate/bundle/api/res-1.0.0-alpha01.txt b/work/workmanager/api/res-1.0.0-rc01.txt
similarity index 100%
copy from savedstate/bundle/api/res-1.0.0-alpha01.txt
copy to work/workmanager/api/res-1.0.0-rc01.txt
diff --git a/work/workmanager/src/androidTest/java/androidx/work/WorkSpecTest.java b/work/workmanager/src/androidTest/java/androidx/work/WorkSpecTest.java
index e0c6cd8..f5f787e 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/WorkSpecTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/WorkSpecTest.java
@@ -19,12 +19,14 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
import android.os.Build;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.work.impl.WorkManagerImpl;
+import androidx.work.impl.model.WorkSpec;
import androidx.work.worker.InfiniteTestWorker;
import org.junit.Test;
@@ -55,7 +57,49 @@
@Test
@SmallTest
- public void testCalculateNextRunTime_firstRunAttempt_periodic() {
+ public void testCalculateNextRunTime_firstRun_periodic_withFlexApplicable() {
+ PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
+ InfiniteTestWorker.class,
+ DEFAULT_INTERVAL_TIME_MS,
+ TimeUnit.MILLISECONDS,
+ DEFAULT_FLEX_TIME_MS,
+ TimeUnit.MILLISECONDS)
+ .build();
+
+ long now = System.currentTimeMillis();
+ WorkSpec workSpec = getWorkSpec(periodicWork);
+ long nextRunTime = workSpec.calculateNextRunTime();
+ if (Build.VERSION.SDK_INT <= WorkManagerImpl.MAX_PRE_JOB_SCHEDULER_API_LEVEL) {
+ assertThat(nextRunTime, greaterThan(now));
+ } else {
+ assertThat(nextRunTime, is(DEFAULT_INTERVAL_TIME_MS - DEFAULT_FLEX_TIME_MS));
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testCalculateNextRunTime_firstRun_periodic_withFlexNotApplicable() {
+ PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
+ InfiniteTestWorker.class,
+ DEFAULT_INTERVAL_TIME_MS,
+ TimeUnit.MILLISECONDS,
+ DEFAULT_INTERVAL_TIME_MS,
+ TimeUnit.MILLISECONDS)
+ .build();
+
+ long now = System.currentTimeMillis();
+ WorkSpec workSpec = getWorkSpec(periodicWork);
+ long nextRunTime = workSpec.calculateNextRunTime();
+ if (Build.VERSION.SDK_INT <= WorkManagerImpl.MAX_PRE_JOB_SCHEDULER_API_LEVEL) {
+ assertThat(nextRunTime, lessThan(now)); // Should be in the past
+ } else {
+ assertThat(nextRunTime, is(0L));
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testCalculateNextRunTime_nextRun_periodic_withFlexApplicable() {
PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
InfiniteTestWorker.class,
DEFAULT_INTERVAL_TIME_MS,
@@ -65,11 +109,13 @@
.setPeriodStartTime(DEFAULT_PERIOD_START_TIME, TimeUnit.MILLISECONDS)
.build();
+ WorkSpec workSpec = getWorkSpec(periodicWork);
+ long nextRunTime = workSpec.calculateNextRunTime();
if (Build.VERSION.SDK_INT <= WorkManagerImpl.MAX_PRE_JOB_SCHEDULER_API_LEVEL) {
- assertThat(getWorkSpec(periodicWork).calculateNextRunTime(),
+ assertThat(nextRunTime,
is(DEFAULT_PERIOD_START_TIME + DEFAULT_INTERVAL_TIME_MS));
} else {
- assertThat(getWorkSpec(periodicWork).calculateNextRunTime(),
+ assertThat(nextRunTime,
is(DEFAULT_PERIOD_START_TIME
+ DEFAULT_INTERVAL_TIME_MS
- DEFAULT_FLEX_TIME_MS));
@@ -78,6 +124,27 @@
@Test
@SmallTest
+ public void testCalculateNextRunTime_nextRun_periodic_withFlexNotApplicable() {
+ PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
+ InfiniteTestWorker.class,
+ DEFAULT_INTERVAL_TIME_MS,
+ TimeUnit.MILLISECONDS,
+ DEFAULT_INTERVAL_TIME_MS,
+ TimeUnit.MILLISECONDS)
+ .setPeriodStartTime(DEFAULT_PERIOD_START_TIME, TimeUnit.MILLISECONDS)
+ .build();
+
+ WorkSpec workSpec = getWorkSpec(periodicWork);
+ long nextRunTime = workSpec.calculateNextRunTime();
+ if (Build.VERSION.SDK_INT <= WorkManagerImpl.MAX_PRE_JOB_SCHEDULER_API_LEVEL) {
+ assertThat(nextRunTime, is(DEFAULT_PERIOD_START_TIME + DEFAULT_INTERVAL_TIME_MS));
+ } else {
+ assertThat(nextRunTime, is(DEFAULT_PERIOD_START_TIME));
+ }
+ }
+
+ @Test
+ @SmallTest
public void testCalculateNextRunTime_rerunAttempt_exponential() {
OneTimeWorkRequest work1 = new OneTimeWorkRequest.Builder(InfiniteTestWorker.class)
.setBackoffCriteria(
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
index 33d5f1e..0b901d5 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
@@ -688,6 +688,28 @@
@Test
@SmallTest
+ public void testPeriodic_firstRun_flexApplied_noDedupe() {
+ PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(
+ TestWorker.class,
+ PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
+ TimeUnit.MILLISECONDS,
+ PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
+ TimeUnit.MILLISECONDS)
+ .build();
+
+ final String periodicWorkId = periodicWork.getStringId();
+ final WorkSpec workSpec = periodicWork.getWorkSpec();
+ workSpec.periodStartTime = 0;
+ insertWork(periodicWork);
+ WorkerWrapper workerWrapper = createBuilder(periodicWorkId).build();
+ FutureListener listener = createAndAddFutureListener(workerWrapper);
+ workerWrapper.run();
+ // Should not get rescheduled
+ assertThat(listener.mResult, is(false));
+ }
+
+ @Test
+ @SmallTest
public void testScheduler() {
OneTimeWorkRequest prerequisiteWork =
new OneTimeWorkRequest.Builder(TestWorker.class).build();
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
index d26ba90..11db087 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
@@ -167,7 +167,17 @@
if (mWorkSpec.isPeriodic() || mWorkSpec.isBackedOff()) {
long now = System.currentTimeMillis();
- if (now < mWorkSpec.calculateNextRunTime()) {
+ // Allow first run of a PeriodicWorkRequest when flex is applicable
+ // (when using AlarmManager) to go through. This is because when periodStartTime=0;
+ // calculateNextRunTime() always > now. We are being overly cautious with the
+ // SDK_INT check and the intervalDuration != flexDuration check.
+ // For more information refer to b/124274584
+ boolean isFirstRunWhenFlexApplicable =
+ Build.VERSION.SDK_INT < WorkManagerImpl.MIN_JOB_SCHEDULER_API_LEVEL
+ && mWorkSpec.intervalDuration != mWorkSpec.flexDuration
+ && mWorkSpec.periodStartTime == 0;
+
+ if (!isFirstRunWhenFlexApplicable && now < mWorkSpec.calculateNextRunTime()) {
Logger.get().debug(TAG,
String.format(
"Delaying execution for %s because it is being executed "
diff --git a/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java b/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java
index e2d1413..b5b3e40 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java
@@ -104,7 +104,7 @@
.getSystemIdInfo(workSpec.id);
if (info != null) {
- JobInfo jobInfo = mJobScheduler.getPendingJob(info.systemId);
+ JobInfo jobInfo = getPendingJobInfo(mJobScheduler, workSpec.id);
if (jobInfo != null) {
Logger.get().debug(TAG, String.format(
"Skipping scheduling %s because JobScheduler is aware of it "
@@ -209,4 +209,25 @@
}
}
}
+
+ private static JobInfo getPendingJobInfo(
+ @NonNull JobScheduler jobScheduler,
+ @NonNull String workSpecId) {
+
+ List<JobInfo> jobInfos = jobScheduler.getAllPendingJobs();
+ // Apparently this CAN be null on API 23?
+ if (jobInfos != null) {
+ for (JobInfo jobInfo : jobInfos) {
+ PersistableBundle extras = jobInfo.getExtras();
+ if (extras != null
+ && extras.containsKey(SystemJobInfoConverter.EXTRA_WORK_SPEC_ID)) {
+ if (workSpecId.equals(
+ extras.getString(SystemJobInfoConverter.EXTRA_WORK_SPEC_ID))) {
+ return jobInfo;
+ }
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpec.java b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpec.java
index 8e35c744..f01f1f1 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpec.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpec.java
@@ -251,9 +251,32 @@
return periodStartTime + Math.min(WorkRequest.MAX_BACKOFF_MILLIS, delay);
} else if (isPeriodic()) {
if (Build.VERSION.SDK_INT <= WorkManagerImpl.MAX_PRE_JOB_SCHEDULER_API_LEVEL) {
- // Don't use flexDuration for determining next run time for PeriodicWork
- // Schedulers <= API 22. This is because intervalDuration could equal flexDuration.
- return periodStartTime + intervalDuration;
+ // Flex is only applicable when it's different from interval duration for
+ // the AlarmManager implementation.
+ boolean isFlexApplicable = flexDuration != intervalDuration;
+ if (isFlexApplicable) {
+ // When a PeriodicWorkRequest is being scheduled for the first time,
+ // the periodStartTime will be 0. To correctly emulate flex, we need to set it
+ // to now, so the PeriodicWorkRequest has an initial delay of
+ // (interval - flex).
+
+ // The subsequent runs will only add the interval duration and no flex.
+ // This gives us the following behavior:
+ // 1 => now + (interval - flex) = firstRunTime
+ // 2 => firstRunTime + 2 * interval - flex
+ // 3 => firstRunTime + 3 * interval - flex
+
+ long offset = periodStartTime == 0 ? (-1 * flexDuration) : 0;
+ long start =
+ periodStartTime == 0 ? System.currentTimeMillis() : periodStartTime;
+ return start + intervalDuration + offset;
+ } else {
+ // Don't use flexDuration for determining next run time for PeriodicWork
+ // Schedulers <= API 22. This is because intervalDuration could equal
+ // flexDuration.
+ return periodStartTime + intervalDuration;
+ }
+
} else {
return periodStartTime + intervalDuration - flexDuration;
}
diff --git a/work/workmanager/src/main/java/androidx/work/impl/utils/WakeLocks.java b/work/workmanager/src/main/java/androidx/work/impl/utils/WakeLocks.java
index 7fa6188..acae4b0 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/utils/WakeLocks.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/utils/WakeLocks.java
@@ -86,7 +86,7 @@
}
for (PowerManager.WakeLock wakeLock : wakeLocksCopy.keySet()) {
- if (wakeLock.isHeld()) {
+ if (wakeLock != null && wakeLock.isHeld()) {
String message = String.format("WakeLock held for %s", wakeLocksCopy.get(wakeLock));
Logger.get().warning(TAG, message);
}