Merge "Use fully qualified package name for media2-widget test resources" into androidx-master-dev
diff --git a/activity/activity-ktx/api/1.0.0.txt b/activity/activity-ktx/api/1.0.0.txt
new file mode 100644
index 0000000..c6e9a9a
--- /dev/null
+++ b/activity/activity-ktx/api/1.0.0.txt
@@ -0,0 +1,15 @@
+// Signature format: 3.0
+package androidx.activity {
+
+ public final class ActivityViewModelLazyKt {
+ ctor public ActivityViewModelLazyKt();
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> viewModels(androidx.activity.ComponentActivity, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+ }
+
+ public final class OnBackPressedDispatcherKt {
+ ctor public OnBackPressedDispatcherKt();
+ method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, androidx.lifecycle.LifecycleOwner? owner = null, boolean enabled = true, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
+ }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/activity/activity-ktx/api/res-1.0.0.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to activity/activity-ktx/api/res-1.0.0.txt
diff --git a/activity/activity-ktx/api/restricted_1.0.0.txt b/activity/activity-ktx/api/restricted_1.0.0.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/activity/activity-ktx/api/restricted_1.0.0.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/activity/activity-ktx/build.gradle b/activity/activity-ktx/build.gradle
index df50b6c..44d017f 100644
--- a/activity/activity-ktx/build.gradle
+++ b/activity/activity-ktx/build.gradle
@@ -35,7 +35,7 @@
dependencies {
api(project(":activity:activity"))
- api("androidx.core:core-ktx:1.1.0-rc01") {
+ api("androidx.core:core-ktx:1.1.0") {
because 'Mirror activity dependency graph for -ktx artifacts'
}
api(project(":lifecycle:lifecycle-runtime-ktx")) {
diff --git a/activity/activity/api/1.0.0.txt b/activity/activity/api/1.0.0.txt
new file mode 100644
index 0000000..9e0f44a
--- /dev/null
+++ b/activity/activity/api/1.0.0.txt
@@ -0,0 +1,37 @@
+// Signature format: 3.0
+package androidx.activity {
+
+ public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+ ctor public ComponentActivity();
+ ctor @ContentView public ComponentActivity(@LayoutRes int);
+ method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+ method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+ method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+ method public androidx.lifecycle.ViewModelStore getViewModelStore();
+ method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+ method public final Object? onRetainNonConfigurationInstance();
+ }
+
+ public abstract class OnBackPressedCallback {
+ ctor public OnBackPressedCallback(boolean);
+ method @MainThread public abstract void handleOnBackPressed();
+ method @MainThread public final boolean isEnabled();
+ method @MainThread public final void remove();
+ method @MainThread public final void setEnabled(boolean);
+ }
+
+ public final class OnBackPressedDispatcher {
+ ctor public OnBackPressedDispatcher();
+ ctor public OnBackPressedDispatcher(Runnable?);
+ method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback);
+ method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.OnBackPressedCallback);
+ method @MainThread public boolean hasEnabledCallbacks();
+ method @MainThread public void onBackPressed();
+ }
+
+ public interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+ method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+ }
+
+}
+
diff --git a/activity/activity/api/1.1.0-alpha03.txt b/activity/activity/api/1.1.0-alpha03.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/1.1.0-alpha03.txt
+++ b/activity/activity/api/1.1.0-alpha03.txt
@@ -6,7 +6,6 @@
ctor @ContentView public ComponentActivity(@LayoutRes int);
method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
method @Deprecated public Object? getLastCustomNonConfigurationInstance();
- method public androidx.lifecycle.Lifecycle getLifecycle();
method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -6,7 +6,6 @@
ctor @ContentView public ComponentActivity(@LayoutRes int);
method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
method @Deprecated public Object? getLastCustomNonConfigurationInstance();
- method public androidx.lifecycle.Lifecycle getLifecycle();
method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/biometric/api/res-1.0.0-beta01.txt b/activity/activity/api/res-1.0.0.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to activity/activity/api/res-1.0.0.txt
diff --git a/activity/activity/api/restricted_1.0.0.txt b/activity/activity/api/restricted_1.0.0.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/activity/activity/api/restricted_1.0.0.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/activity/activity/api/restricted_1.1.0-alpha03.txt b/activity/activity/api/restricted_1.1.0-alpha03.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/restricted_1.1.0-alpha03.txt
+++ b/activity/activity/api/restricted_1.1.0-alpha03.txt
@@ -6,7 +6,6 @@
ctor @ContentView public ComponentActivity(@LayoutRes int);
method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
method @Deprecated public Object? getLastCustomNonConfigurationInstance();
- method public androidx.lifecycle.Lifecycle getLifecycle();
method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -6,7 +6,6 @@
ctor @ContentView public ComponentActivity(@LayoutRes int);
method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
method @Deprecated public Object? getLastCustomNonConfigurationInstance();
- method public androidx.lifecycle.Lifecycle getLifecycle();
method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index b6edf7e..36959fc 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -18,7 +18,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
api(project(":lifecycle:lifecycle-runtime"))
api(project(":lifecycle:lifecycle-viewmodel"))
api("androidx.savedstate:savedstate:1.0.0-rc01")
diff --git a/ads/ads-identifier-provider/build.gradle b/ads/ads-identifier-provider/build.gradle
index 78b4ade..535bbde 100644
--- a/ads/ads-identifier-provider/build.gradle
+++ b/ads/ads-identifier-provider/build.gradle
@@ -27,7 +27,7 @@
dependencies {
implementation("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation(AUTO_VALUE_ANNOTATIONS)
annotationProcessor(AUTO_VALUE)
diff --git a/ads/ads-identifier/build.gradle b/ads/ads-identifier/build.gradle
index 3eca9f2..3ab81a6 100644
--- a/ads/ads-identifier/build.gradle
+++ b/ads/ads-identifier/build.gradle
@@ -27,7 +27,7 @@
dependencies {
implementation("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation(AUTO_VALUE_ANNOTATIONS)
annotationProcessor(AUTO_VALUE)
api(GUAVA_LISTENABLE_FUTURE)
diff --git a/animation/build.gradle b/animation/build.gradle
index 65781d0..1d1800e 100644
--- a/animation/build.gradle
+++ b/animation/build.gradle
@@ -26,7 +26,7 @@
dependencies {
implementation("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT, libs.exclude_for_espresso)
diff --git a/animation/integration-tests/testapp/build.gradle b/animation/integration-tests/testapp/build.gradle
index 82a6fe05..a9992a4 100644
--- a/animation/integration-tests/testapp/build.gradle
+++ b/animation/integration-tests/testapp/build.gradle
@@ -23,7 +23,7 @@
dependencies {
implementation("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation(project(":animation"))
implementation(project(":animation:testing"))
diff --git a/animation/testing/build.gradle b/animation/testing/build.gradle
index f33191e..ad98a4c 100644
--- a/animation/testing/build.gradle
+++ b/animation/testing/build.gradle
@@ -26,7 +26,7 @@
dependencies {
implementation("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation(project(":animation"))
implementation(ANDROIDX_TEST_EXT_JUNIT)
implementation(ANDROIDX_TEST_CORE)
diff --git a/appcompat/build.gradle b/appcompat/build.gradle
index 0f1a603..f9f3a5c 100644
--- a/appcompat/build.gradle
+++ b/appcompat/build.gradle
@@ -12,7 +12,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
api("androidx.cursoradapter:cursoradapter:1.0.0")
api("androidx.fragment:fragment:1.1.0-rc01")
diff --git a/appcompat/res/values-v23/styles_base.xml b/appcompat/res/values-v23/styles_base.xml
index f202cb8..d0ffcc3 100644
--- a/appcompat/res/values-v23/styles_base.xml
+++ b/appcompat/res/values-v23/styles_base.xml
@@ -19,7 +19,9 @@
<style name="Base.Widget.AppCompat.Button.Borderless.Colored" parent="android:Widget.Material.Button.Borderless.Colored" />
- <style name="Base.Widget.AppCompat.Button.Colored" parent="android:Widget.Material.Button.Colored" />
+ <style name="Base.Widget.AppCompat.Button.Colored" parent="android:Widget.Material.Button.Colored" >
+ <item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.Button.Colored</item>
+ </style>
<style name="Base.Widget.AppCompat.RatingBar.Indicator" parent="android:Widget.Material.RatingBar.Indicator" />
diff --git a/asynclayoutinflater/build.gradle b/asynclayoutinflater/build.gradle
index 2c12378..3dcd2f0 100644
--- a/asynclayoutinflater/build.gradle
+++ b/asynclayoutinflater/build.gradle
@@ -9,7 +9,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
}
androidx {
diff --git a/biometric/api/1.0.0-beta01.txt b/biometric/api/1.0.0-alpha06.txt
similarity index 96%
rename from biometric/api/1.0.0-beta01.txt
rename to biometric/api/1.0.0-alpha06.txt
index 63a2dfc..b17b443 100644
--- a/biometric/api/1.0.0-beta01.txt
+++ b/biometric/api/1.0.0-alpha06.txt
@@ -65,7 +65,7 @@
method public androidx.biometric.BiometricPrompt.PromptInfo build();
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
- method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+ method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
diff --git a/biometric/api/current.txt b/biometric/api/current.txt
index 63a2dfc..b17b443 100644
--- a/biometric/api/current.txt
+++ b/biometric/api/current.txt
@@ -65,7 +65,7 @@
method public androidx.biometric.BiometricPrompt.PromptInfo build();
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
- method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+ method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
diff --git a/biometric/api/res-1.0.0-beta01.txt b/biometric/api/res-1.0.0-alpha06.txt
similarity index 100%
rename from biometric/api/res-1.0.0-beta01.txt
rename to biometric/api/res-1.0.0-alpha06.txt
diff --git a/biometric/api/restricted_1.0.0-beta01.txt b/biometric/api/restricted_1.0.0-alpha06.txt
similarity index 95%
rename from biometric/api/restricted_1.0.0-beta01.txt
rename to biometric/api/restricted_1.0.0-alpha06.txt
index 6e7da51..cf9f995 100644
--- a/biometric/api/restricted_1.0.0-beta01.txt
+++ b/biometric/api/restricted_1.0.0-alpha06.txt
@@ -54,7 +54,7 @@
method public androidx.biometric.BiometricPrompt.PromptInfo build();
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
- method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+ method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
@@ -63,5 +63,6 @@
+
}
diff --git a/biometric/api/restricted_current.txt b/biometric/api/restricted_current.txt
index 6e7da51..cf9f995 100644
--- a/biometric/api/restricted_current.txt
+++ b/biometric/api/restricted_current.txt
@@ -54,7 +54,7 @@
method public androidx.biometric.BiometricPrompt.PromptInfo build();
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
- method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+ method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
@@ -63,5 +63,6 @@
+
}
diff --git a/biometric/build.gradle b/biometric/build.gradle
index e423137..e1dbcfe 100644
--- a/biometric/build.gradle
+++ b/biometric/build.gradle
@@ -10,7 +10,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
api("androidx.appcompat:appcompat:1.1.0-rc01")
- api("androidx.core:core:1.1.0-rc02")
+ api("androidx.core:core:1.1.0")
api("androidx.fragment:fragment:1.1.0-rc01")
}
diff --git a/biometric/res/layout/device_credential_handler_activity.xml b/biometric/res/layout/device_credential_handler_activity.xml
new file mode 100644
index 0000000..5708761
--- /dev/null
+++ b/biometric/res/layout/device_credential_handler_activity.xml
@@ -0,0 +1,21 @@
+<?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.
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent" android:layout_height="match_parent">
+
+</FrameLayout>
\ No newline at end of file
diff --git a/biometric/res/values/strings.xml b/biometric/res/values/strings.xml
index 1ee1534..04516c6 100644
--- a/biometric/res/values/strings.xml
+++ b/biometric/res/values/strings.xml
@@ -36,4 +36,10 @@
<string name="fingerprint_error_lockout">Too many attempts. Please try again later.</string>
<!-- Generic error message shown when an unknown error has occurred. [CHAR LIMIT=NONE] -->
<string name="default_error_msg">Unknown error</string>
+ <!-- Generic error message shown when the authentication operation is canceled due to user
+ input. Generally not shown to the user. [CHAR LIMIT=NONE] -->
+ <string name="generic_error_user_canceled">Authentication canceled by user.</string>
+ <!-- Button label shown on a biometric authentication system dialog that lets the user
+ authenticate using their lock screen credential (such as PIN or password). [CHAR LIMIT=30] -->
+ <string name="confirm_device_credential_password">Use password</string>
</resources>
diff --git a/biometric/res/values/styles.xml b/biometric/res/values/styles.xml
new file mode 100644
index 0000000..fce6eb0
--- /dev/null
+++ b/biometric/res/values/styles.xml
@@ -0,0 +1,36 @@
+<?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.
+ -->
+
+<resources>
+ <style name="DeviceCredentialHandlerTheme" parent="Theme.AppCompat">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowIsFloating">true</item>
+ <item name="android:backgroundDimEnabled">false</item>
+ </style>
+
+ <style name="TransparentStyle">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowIsFloating">true</item>
+ <item name="android:backgroundDimEnabled">false</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/biometric/src/main/AndroidManifest.xml b/biometric/src/main/AndroidManifest.xml
index af0a0328..8ff1f77 100644
--- a/biometric/src/main/AndroidManifest.xml
+++ b/biometric/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,8 +13,17 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest package="androidx.biometric"
- xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.biometric">
+
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
+
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
-</manifest>
+
+ <application>
+ <activity
+ android:name=".DeviceCredentialHandlerActivity"
+ android:theme="@style/DeviceCredentialHandlerTheme" />
+ </application>
+
+</manifest>
\ No newline at end of file
diff --git a/biometric/src/main/java/androidx/biometric/BiometricFragment.java b/biometric/src/main/java/androidx/biometric/BiometricFragment.java
index 941161b..26a95601 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricFragment.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricFragment.java
@@ -17,8 +17,10 @@
package androidx.biometric;
import android.annotation.SuppressLint;
+import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
@@ -35,6 +37,7 @@
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
import java.util.concurrent.Executor;
@@ -43,10 +46,11 @@
* device configuration changes. This class is not meant to be preserved after process death; for
* security reasons, the BiometricPromptCompat will automatically stop authentication when the
* activity is no longer in the foreground.
+ *
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(28)
+@RequiresApi(Build.VERSION_CODES.P)
@SuppressLint("SyntheticAccessor")
public class BiometricFragment extends Fragment {
@@ -75,12 +79,7 @@
// Do not rely on the application's executor when calling into the framework's code.
private final Handler mHandler = new Handler(Looper.getMainLooper());
- private final Executor mExecutor = new Executor() {
- @Override
- public void execute(Runnable runnable) {
- mHandler.post(runnable);
- }
- };
+ private final Executor mExecutor = mHandler::post;
// Also created once and retained.
private final android.hardware.biometrics.BiometricPrompt.AuthenticationCallback
@@ -89,18 +88,15 @@
@Override
public void onAuthenticationError(final int errorCode,
final CharSequence errString) {
- mClientExecutor.execute(new Runnable() {
- @Override
- public void run() {
- CharSequence error = errString;
- if (error == null) {
- error = mContext.getString(R.string.default_error_msg) + " "
- + errorCode;
- }
- mClientAuthenticationCallback
- .onAuthenticationError(Utils.isUnknownError(errorCode)
- ? BiometricPrompt.ERROR_VENDOR : errorCode, error);
+ mClientExecutor.execute(() -> {
+ CharSequence error = errString;
+ if (error == null) {
+ error = mContext.getString(R.string.default_error_msg) + " "
+ + errorCode;
}
+ mClientAuthenticationCallback
+ .onAuthenticationError(Utils.isUnknownError(errorCode)
+ ? BiometricPrompt.ERROR_VENDOR : errorCode, error);
});
cleanup();
}
@@ -115,30 +111,21 @@
public void onAuthenticationSucceeded(
final android.hardware.biometrics.BiometricPrompt.AuthenticationResult
result) {
- mClientExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mClientAuthenticationCallback.onAuthenticationSucceeded(
+ mClientExecutor.execute(
+ () -> mClientAuthenticationCallback.onAuthenticationSucceeded(
new BiometricPrompt.AuthenticationResult(
- unwrapCryptoObject(result.getCryptoObject())));
- }
- });
+ unwrapCryptoObject(result.getCryptoObject()))));
cleanup();
}
@Override
public void onAuthenticationFailed() {
- mClientExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mClientAuthenticationCallback.onAuthenticationFailed();
- }
- });
+ mClientExecutor.execute(mClientAuthenticationCallback::onAuthenticationFailed);
}
};
// Also created once and retained.
- private DialogInterface.OnClickListener mNegativeButtonListener =
+ private final DialogInterface.OnClickListener mNegativeButtonListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
@@ -146,23 +133,61 @@
}
};
+ // Also created once and retained.
+ @SuppressWarnings("deprecation")
+ private final DialogInterface.OnClickListener mDeviceCredentialButtonListener =
+ (dialog, which) -> {
+ if (which == DialogInterface.BUTTON_NEGATIVE) {
+ final FragmentActivity activity = getActivity();
+ if (!(activity instanceof DeviceCredentialHandlerActivity)) {
+ Log.e(TAG, "Failed to check device credential. Parent handler not found.");
+ return;
+ }
+
+ final KeyguardManager km = activity.getSystemService(KeyguardManager.class);
+ if (km == null) {
+ Log.e(TAG, "Failed to check device credential. KeyguardManager was null.");
+ return;
+ }
+
+ // Pass along the title and subtitle from the biometric prompt.
+ final CharSequence title;
+ final CharSequence subtitle;
+ if (mBundle != null) {
+ title = mBundle.getCharSequence(BiometricPrompt.KEY_TITLE);
+ subtitle = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
+ } else {
+ title = null;
+ subtitle = null;
+ }
+
+ // Prevent the bridge from resetting until the confirmation activity finishes.
+ DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null) {
+ bridge.startIgnoringReset();
+ }
+
+ // Launch a new instance of the confirm device credential Settings activity.
+ final Intent intent = km.createConfirmDeviceCredentialIntent(title, subtitle);
+ intent.setFlags(
+ Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+ activity.startActivityForResult(intent, 0 /* requestCode */);
+ }
+ };
+
/**
* Creates a new instance of the {@link BiometricFragment}.
- * @return
*/
- public static BiometricFragment newInstance() {
- BiometricFragment biometricFragment = new BiometricFragment();
- return biometricFragment;
+ static BiometricFragment newInstance() {
+ return new BiometricFragment();
}
/**
* Sets the client's callback. This should be done whenever the lifecycle changes (orientation
* changes).
- * @param executor
- * @param onClickListener
- * @param authenticationCallback
*/
- protected void setCallbacks(Executor executor, DialogInterface.OnClickListener onClickListener,
+ void setCallbacks(Executor executor, DialogInterface.OnClickListener onClickListener,
BiometricPrompt.AuthenticationCallback authenticationCallback) {
mClientExecutor = executor;
mClientNegativeButtonListener = onClickListener;
@@ -172,16 +197,15 @@
/**
* Sets the crypto object to be associated with the authentication. Should be called before
* adding the fragment to guarantee that it's ready in onCreate().
- * @param crypto
*/
- protected void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
+ void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
mCryptoObject = crypto;
}
/**
* Cancel the authentication.
*/
- protected void cancel() {
+ void cancel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isDeviceCredentialAllowed()) {
if (!mStartRespectingCancel) {
Log.w(TAG, "Ignoring fast cancel signal");
@@ -199,11 +223,14 @@
*/
void cleanup() {
mShowing = false;
+ FragmentActivity activity = getActivity();
if (getFragmentManager() != null) {
getFragmentManager().beginTransaction().detach(this).commitAllowingStateLoss();
}
+ Utils.maybeFinishHandler(activity);
}
+ @Nullable
protected CharSequence getNegativeButtonText() {
return mNegativeButtonText;
}
@@ -218,12 +245,12 @@
mBundle = bundle;
}
- public boolean isDeviceCredentialAllowed() {
+ boolean isDeviceCredentialAllowed() {
return mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL, false);
}
@Override
- public void onAttach(Context context) {
+ public void onAttach(@NonNull Context context) {
super.onAttach(context);
mContext = context;
}
@@ -234,37 +261,40 @@
// Start the actual authentication when the fragment is attached.
if (!mShowing) {
mNegativeButtonText = mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
+
final android.hardware.biometrics.BiometricPrompt.Builder builder =
new android.hardware.biometrics.BiometricPrompt.Builder(getContext());
builder.setTitle(mBundle.getCharSequence(BiometricPrompt.KEY_TITLE))
.setSubtitle(mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE))
.setDescription(mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION));
- // The negative text could be empty if setDeviceCredentialAllowed is true.
- if (!TextUtils.isEmpty(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT))) {
+
+ final boolean allowDeviceCredential =
+ mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL);
+
+ // Provide our own negative button text if allowing device credential on <= P.
+ if (allowDeviceCredential && Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
+ mNegativeButtonText = getString(R.string.confirm_device_credential_password);
builder.setNegativeButton(
- mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT),
- mClientExecutor, mNegativeButtonListener);
+ mNegativeButtonText, mClientExecutor, mDeviceCredentialButtonListener);
+ } else if (!TextUtils.isEmpty(mNegativeButtonText)) {
+ builder.setNegativeButton(
+ mNegativeButtonText, mClientExecutor, mNegativeButtonListener);
}
+ // Set builder flags introduced in Q.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
builder.setConfirmationRequired(
mBundle.getBoolean((BiometricPrompt.KEY_REQUIRE_CONFIRMATION), true));
- builder.setDeviceCredentialAllowed(
- mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL));
+ builder.setDeviceCredentialAllowed(allowDeviceCredential);
}
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- if (mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL, false)) {
- mStartRespectingCancel = false;
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- // Hack almost over 9000, ignore cancel signal in Q if it's within the
- // first quarter second.
- mStartRespectingCancel = true;
- }
- }, 250 /* ms */);
- }
+ if (allowDeviceCredential) {
+ mStartRespectingCancel = false;
+ mHandler.postDelayed(() -> {
+ // Hack almost over 9000, ignore cancel signal if it's within the first quarter
+ // second.
+ mStartRespectingCancel = true;
+ }, 250 /* ms */);
}
mBiometricPrompt = builder.build();
@@ -281,7 +311,7 @@
return super.onCreateView(inflater, container, savedInstanceState);
}
- static BiometricPrompt.CryptoObject unwrapCryptoObject(
+ private static BiometricPrompt.CryptoObject unwrapCryptoObject(
android.hardware.biometrics.BiometricPrompt.CryptoObject cryptoObject) {
if (cryptoObject == null) {
return null;
@@ -296,7 +326,7 @@
}
}
- static android.hardware.biometrics.BiometricPrompt.CryptoObject wrapCryptoObject(
+ private static android.hardware.biometrics.BiometricPrompt.CryptoObject wrapCryptoObject(
BiometricPrompt.CryptoObject cryptoObject) {
if (cryptoObject == null) {
return null;
diff --git a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
index cd000b0..eb98834 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -20,6 +20,8 @@
import android.annotation.SuppressLint;
import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -29,7 +31,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -81,6 +83,7 @@
static final String KEY_NEGATIVE_TEXT = "negative_text";
static final String KEY_REQUIRE_CONFIRMATION = "require_confirmation";
static final String KEY_ALLOW_DEVICE_CREDENTIAL = "allow_device_credential";
+ static final String KEY_HANDLING_DEVICE_CREDENTIAL_RESULT = "handling_device_credential_result";
@Retention(SOURCE)
@IntDef({ERROR_HW_UNAVAILABLE,
@@ -96,7 +99,8 @@
ERROR_HW_NOT_PRESENT,
ERROR_NEGATIVE_BUTTON,
ERROR_NO_DEVICE_CREDENTIAL})
- private @interface BiometricError {}
+ private @interface BiometricError {
+ }
/**
* A wrapper class for the crypto objects supported by BiometricPrompt. Currently the
@@ -127,6 +131,7 @@
/**
* Get {@link Signature} object.
+ *
* @return {@link Signature} object or null if this doesn't contain one.
*/
@Nullable
@@ -136,6 +141,7 @@
/**
* Get {@link Cipher} object.
+ *
* @return {@link Cipher} object or null if this doesn't contain one.
*/
@Nullable
@@ -145,6 +151,7 @@
/**
* Get {@link Mac} object.
+ *
* @return {@link Mac} object or null if this doesn't contain one.
*/
@Nullable
@@ -161,7 +168,7 @@
private final CryptoObject mCryptoObject;
/**
- * @param crypto
+ *
*/
AuthenticationResult(CryptoObject crypto) {
mCryptoObject = crypto;
@@ -169,6 +176,7 @@
/**
* Obtain the crypto object associated with this transaction
+ *
* @return crypto object provided to {@link #authenticate(PromptInfo, CryptoObject)}.
*/
@Nullable
@@ -186,24 +194,29 @@
/**
* Called when an unrecoverable error has been encountered and the operation is complete.
* No further actions will be made on this object.
+ *
* @param errorCode An integer identifying the error message. The error message will usually
* be one of the BIOMETRIC_ERROR constants.
* @param errString A human-readable error string that can be shown on an UI
*/
public void onAuthenticationError(@BiometricError int errorCode,
- @NonNull CharSequence errString) {}
+ @NonNull CharSequence errString) {
+ }
/**
* Called when a biometric is recognized.
+ *
* @param result An object containing authentication-related data
*/
- public void onAuthenticationSucceeded(@NonNull AuthenticationResult result) {}
+ public void onAuthenticationSucceeded(@NonNull AuthenticationResult result) {
+ }
/**
* Called when a biometric is valid but not recognized.
*/
- public void onAuthenticationFailed() {}
+ public void onAuthenticationFailed() {
+ }
}
/**
@@ -249,8 +262,6 @@
* Required: Set the text for the negative button. This would typically be used as a
* "Cancel" button, but may be also used to show an alternative method for
* authentication, such as screen that asks for a backup password.
- * @param text
- * @return
*/
@NonNull
public Builder setNegativeButtonText(@NonNull CharSequence text) {
@@ -288,16 +299,19 @@
* first check {@link android.app.KeyguardManager#isDeviceSecure()} before enabling
* this. If the device is not secure, {@link BiometricPrompt#ERROR_NO_DEVICE_CREDENTIAL}
* will be returned in
- * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}}
+ * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}.
*
* Note that {@link Builder#setNegativeButtonText(CharSequence)} should not be set
* if this is set to true.
*
+ * On versions P and below, once the device credential prompt is shown,
+ * {@link #cancelAuthentication()} will not work, since the library internally launches
+ * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence,
+ * CharSequence)}, which does not have a public API for cancellation.
+ *
* @param enable When true, the prompt will fall back to ask for the user's device
* credentials (PIN, pattern, or password).
- * @return
*/
- @RequiresApi(29)
@NonNull
public Builder setDeviceCredentialAllowed(boolean enable) {
mBundle.putBoolean(KEY_ALLOW_DEVICE_CREDENTIAL, enable);
@@ -305,7 +319,23 @@
}
/**
+ * A flag that is set to true when launching the prompt within the transparent
+ * {@link DeviceCredentialHandlerActivity}. This lets us handle the result of {@link
+ * android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence,
+ * CharSequence)} in order to allow device credentials for <= P.
+ *
+ * @hide
+ */
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
+ @NonNull
+ Builder setHandlingDeviceCredentialResult(boolean isHandling) {
+ mBundle.putBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT, isHandling);
+ return this;
+ }
+
+ /**
* Creates a {@link BiometricPrompt}.
+ *
* @return a {@link BiometricPrompt}
* @throws IllegalArgumentException if any of the required fields are not set.
*/
@@ -314,6 +344,8 @@
final CharSequence title = mBundle.getCharSequence(KEY_TITLE);
final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT);
boolean allowDeviceCredential = mBundle.getBoolean(KEY_ALLOW_DEVICE_CREDENTIAL);
+ boolean handlingDeviceCredentialResult =
+ mBundle.getBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT);
if (TextUtils.isEmpty(title)) {
throw new IllegalArgumentException("Title must be set and non-empty");
@@ -325,6 +357,10 @@
throw new IllegalArgumentException("Can't have both negative button behavior"
+ " and device credential enabled");
}
+ if (handlingDeviceCredentialResult && !allowDeviceCredential) {
+ throw new IllegalArgumentException("Can't be handling device credential result"
+ + " without device credential enabled");
+ }
return new PromptInfo(mBundle);
}
}
@@ -384,57 +420,63 @@
public boolean isDeviceCredentialAllowed() {
return mBundle.getBoolean(KEY_ALLOW_DEVICE_CREDENTIAL);
}
+
+ /**
+ * @return See {@link Builder#setHandlingDeviceCredentialResult(boolean)}.
+ *
+ * @hide
+ */
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
+ boolean isHandlingDeviceCredentialResult() {
+ return mBundle.getBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT);
+ }
}
// Passed in from the client.
- FragmentActivity mFragmentActivity;
- Fragment mFragment;
- final Executor mExecutor;
- final AuthenticationCallback mAuthenticationCallback;
+ private FragmentActivity mFragmentActivity;
+ private Fragment mFragment;
+ private final Executor mExecutor;
+ private final AuthenticationCallback mAuthenticationCallback;
// Created internally for devices before P.
- FingerprintDialogFragment mFingerprintDialogFragment;
- FingerprintHelperFragment mFingerprintHelperFragment;
+ private FingerprintDialogFragment mFingerprintDialogFragment;
+ private FingerprintHelperFragment mFingerprintHelperFragment;
// Created internally for devices P and above.
- BiometricFragment mBiometricFragment;
+ private BiometricFragment mBiometricFragment;
// In Q, we must ignore the first onPause if setDeviceCredentialAllowed is true, since
// the Q implementation launches ConfirmDeviceCredentialActivity which is an activity and
// puts the client app onPause.
- boolean mPausedOnce;
+ private boolean mPausedOnce;
+
+ // Whether this prompt is being hosted in DeviceCredentialHandlerActivity.
+ private boolean mIsHandlingDeviceCredential;
/**
- * A shim to interface with the framework API and simplify the support library's API.
- * The support library sends onAuthenticationError when the negative button is pressed.
- * Conveniently, the {@link FingerprintDialogFragment} also uses the
- * {@DialogInterface.OnClickListener} for its buttons ;)
+ * A shim to interface with the framework API and simplify the support library's API.
+ * The support library sends onAuthenticationError when the negative button is pressed.
+ * Conveniently, the {@link FingerprintDialogFragment} also uses the
+ * {@link DialogInterface.OnClickListener} for its buttons ;)
*/
- final DialogInterface.OnClickListener mNegativeButtonListener =
+ private final DialogInterface.OnClickListener mNegativeButtonListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
- && !DEBUG_FORCE_FINGERPRINT) {
- CharSequence errorText =
- mBiometricFragment.getNegativeButtonText();
- mAuthenticationCallback.onAuthenticationError(
- ERROR_NEGATIVE_BUTTON,
- errorText);
- mBiometricFragment.cleanup();
- } else {
- CharSequence errorText =
- mFingerprintDialogFragment.getNegativeButtonText();
- mAuthenticationCallback.onAuthenticationError(
- ERROR_NEGATIVE_BUTTON,
- errorText);
- mFingerprintHelperFragment.cancel(
- FingerprintHelperFragment
- .USER_CANCELED_FROM_NEGATIVE_BUTTON);
- }
+ mExecutor.execute(() -> {
+ if (usingBiometricFragment()) {
+ final CharSequence errorText =
+ mBiometricFragment.getNegativeButtonText();
+ mAuthenticationCallback.onAuthenticationError(
+ ERROR_NEGATIVE_BUTTON, errorText != null ? errorText : "");
+ mBiometricFragment.cleanup();
+ } else {
+ final CharSequence errorText =
+ mFingerprintDialogFragment.getNegativeButtonText();
+ mAuthenticationCallback.onAuthenticationError(
+ ERROR_NEGATIVE_BUTTON, errorText != null ? errorText : "");
+ mFingerprintHelperFragment.cancel(
+ FingerprintHelperFragment.USER_CANCELED_FROM_NEGATIVE_BUTTON);
}
});
}
@@ -448,21 +490,14 @@
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause() {
if (!isChangingConfigurations()) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
+ if (usingBiometricFragment()) {
// May be null if no authentication is occurring.
- if (mFingerprintDialogFragment != null) {
- mFingerprintDialogFragment.dismiss();
- }
- if (mFingerprintHelperFragment != null) {
- mFingerprintHelperFragment.cancel(
- FingerprintHelperFragment.USER_CANCELED_FROM_NONE);
- }
- } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- // TODO(b/123378871): Change == to >= if this bug is not resolved in R.
- // Ignore the first onPause if setDeviceCredentialAllowed is true, since
- // the Q implementation launches ConfirmDeviceCredentialActivity which is an
- // activity and puts the client app onPause.
if (mBiometricFragment != null) {
+ // TODO(b/123378871): Fix behavior in R and remove this workaround.
+ // Ignore the first onPause if isDeviceCredentialAllowed is true, since
+ // the Q implementation launches ConfirmDeviceCredentialActivity, which puts
+ // the client app onPause. Implementations prior to Q instead launch
+ // DeviceCredentialHandlerActivity, resulting in the same problem.
if (mBiometricFragment.isDeviceCredentialAllowed()) {
if (!mPausedOnce) {
mPausedOnce = true;
@@ -473,17 +508,20 @@
mBiometricFragment.cancel();
}
}
- } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- if (mBiometricFragment != null) {
- mBiometricFragment.cancel();
+ } else {
+ // May be null if no authentication is occurring.
+ if (mFingerprintDialogFragment != null && mFingerprintHelperFragment != null) {
+ dismissFingerprintFragments(mFingerprintDialogFragment,
+ mFingerprintHelperFragment);
}
}
+ maybeResetHandlerBridge();
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
+ if (usingBiometricFragment()) {
mBiometricFragment =
(BiometricFragment) getFragmentManager().findFragmentByTag(
BIOMETRIC_FRAGMENT_TAG);
@@ -508,12 +546,15 @@
mFingerprintHelperFragment.setHandler(mFingerprintDialogFragment.getHandler());
}
}
+
+ maybeHandleDeviceCredentialResult();
+ maybeInitHandlerBridge(false /* ignoreNextReset */);
}
};
/**
* Constructs a {@link BiometricPrompt} which can be used to prompt the user for
- * authentication. The authenticaton prompt created by
+ * authentication. The authentication prompt created by
* {@link BiometricPrompt#authenticate(PromptInfo, CryptoObject)} and
* {@link BiometricPrompt#authenticate(PromptInfo)} will persist across device
* configuration changes by default. If authentication is in progress, re-creating
@@ -523,8 +564,8 @@
* such as {@link FragmentActivity#onCreate(Bundle)}.
*
* @param fragmentActivity A reference to the client's activity.
- * @param executor An executor to handle callback events.
- * @param callback An object to receive authentication events.
+ * @param executor An executor to handle callback events.
+ * @param callback An object to receive authentication events.
*/
@SuppressLint("LambdaLast")
public BiometricPrompt(@NonNull FragmentActivity fragmentActivity,
@@ -582,8 +623,9 @@
/**
* Shows the biometric prompt. The prompt survives lifecycle changes by default. To cancel the
* authentication, use {@link #cancelAuthentication()}.
- * @param info The information that will be displayed on the prompt. Create this object using
- * {@link BiometricPrompt.PromptInfo.Builder}.
+ *
+ * @param info The information that will be displayed on the prompt. Create this object using
+ * {@link BiometricPrompt.PromptInfo.Builder}.
* @param crypto The crypto object associated with the authentication.
*/
public void authenticate(@NonNull PromptInfo info, @NonNull CryptoObject crypto) {
@@ -600,6 +642,7 @@
/**
* Shows the biometric prompt. The prompt survives lifecycle changes by default. To cancel the
* authentication, use {@link #cancelAuthentication()}.
+ *
* @param info The information that will be displayed on the prompt. Create this object using
* {@link BiometricPrompt.PromptInfo.Builder}.
*/
@@ -611,12 +654,19 @@
}
private void authenticateInternal(@NonNull PromptInfo info, @Nullable CryptoObject crypto) {
+ mIsHandlingDeviceCredential = info.isHandlingDeviceCredentialResult();
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P && info.isDeviceCredentialAllowed()
+ && !mIsHandlingDeviceCredential) {
+ launchDeviceCredentialHandler(info);
+ return;
+ }
+
final Bundle bundle = info.getBundle();
final FragmentManager fragmentManager = getFragmentManager();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
- mPausedOnce = false;
+ mPausedOnce = false;
+ if (usingBiometricFragment()) {
BiometricFragment biometricFragment =
(BiometricFragment) fragmentManager.findFragmentByTag(
BIOMETRIC_FRAGMENT_TAG);
@@ -627,6 +677,7 @@
}
mBiometricFragment.setCallbacks(mExecutor, mNegativeButtonListener,
mAuthenticationCallback);
+
// Set the crypto object.
mBiometricFragment.setCryptoObject(crypto);
mBiometricFragment.setBundle(bundle);
@@ -687,6 +738,7 @@
fragmentManager.beginTransaction().attach(mFingerprintHelperFragment).commit();
}
}
+
// For the case when onResume() is being called right after authenticate,
// we need to make sure that all fragment transactions have been committed.
fragmentManager.executePendingTransactions();
@@ -695,26 +747,162 @@
/**
* Cancels the biometric authentication, and dismisses the dialog upon confirmation from the
* biometric service.
+ *
+ * On P or below, calling this method when the device credential prompt is shown will NOT work
+ * as expected. See {@link PromptInfo.Builder#setDeviceCredentialAllowed(boolean)} for more
+ * details.
*/
public void cancelAuthentication() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
+ if (usingBiometricFragment()) {
if (mBiometricFragment != null) {
mBiometricFragment.cancel();
}
+
+ // If we launched a device credential handler activity, also clean up its fragment.
+ if (!mIsHandlingDeviceCredential) {
+ final DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null && bridge.getBiometricFragment() != null) {
+ bridge.getBiometricFragment().cancel();
+ }
+ }
} else {
if (mFingerprintHelperFragment != null && mFingerprintDialogFragment != null) {
- mFingerprintHelperFragment.cancel(
- FingerprintHelperFragment.USER_CANCELED_FROM_NONE);
- mFingerprintDialogFragment.dismiss();
+ dismissFingerprintFragments(mFingerprintDialogFragment, mFingerprintHelperFragment);
}
+
+ // If we launched a device credential handler activity, also clean up its fragment.
+ if (!mIsHandlingDeviceCredential) {
+ final DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null && bridge.getFingerprintDialogFragment() != null
+ && bridge.getFingerprintHelperFragment() != null) {
+ dismissFingerprintFragments(bridge.getFingerprintDialogFragment(),
+ bridge.getFingerprintHelperFragment());
+ }
+ }
+ }
+ }
+
+ /**
+ * Launches a copy of this prompt in a transparent {@link DeviceCredentialHandlerActivity}.
+ * This allows that activity to intercept and handle activity results from {@link
+ * android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence)}.
+ */
+ private void launchDeviceCredentialHandler(PromptInfo info) {
+ final FragmentActivity activity = getActivity();
+ if (activity == null || activity.isFinishing()) {
+ Log.w(TAG, "Failed to start handler activity. Parent activity was null or finishing.");
+ return;
+ }
+
+ maybeInitHandlerBridge(true /* ignoreNextReset */);
+
+ // Set the handling device credential flag so the new prompt knows not to launch another
+ // instance of the handler activity.
+ final Bundle infoBundle = info.getBundle();
+ infoBundle.putBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT, true);
+
+ final Intent intent = new Intent(activity, DeviceCredentialHandlerActivity.class);
+ intent.putExtra(DeviceCredentialHandlerActivity.EXTRA_PROMPT_INFO_BUNDLE, infoBundle);
+ activity.startActivity(intent);
+ }
+
+ /**
+ * Creates (if necessary) the singleton bridge used for communication between the client-hosted
+ * prompt and one hosted by {@link DeviceCredentialHandlerActivity}, and initializes all of the
+ * relevant data for the bridge.
+ *
+ * @param ignoreNextReset Whether the bridge should ignore the next call to
+ * {@link DeviceCredentialHandlerBridge#reset()} once initialized.
+ */
+ private void maybeInitHandlerBridge(boolean ignoreNextReset) {
+ // Don't create bridge if DeviceCredentialHandlerActivity isn't needed.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ return;
+ }
+
+ final DeviceCredentialHandlerBridge bridge = DeviceCredentialHandlerBridge.getInstance();
+ if (mIsHandlingDeviceCredential) {
+ if (usingBiometricFragment() && mBiometricFragment != null) {
+ bridge.setBiometricFragment(mBiometricFragment);
+ } else if (mFingerprintDialogFragment != null && mFingerprintHelperFragment != null) {
+ bridge.setFingerprintFragments(mFingerprintDialogFragment,
+ mFingerprintHelperFragment);
+ }
+ } else {
+ // If hosted by the client, register the current activity theme to the bridge.
+ final FragmentActivity activity = getActivity();
+ if (activity != null) {
+ try {
+ bridge.setClientThemeResId(activity.getPackageManager().getActivityInfo(
+ activity.getComponentName(), 0).getThemeResource());
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Failed to register client theme to bridge", e);
+ }
+ }
+ }
+ bridge.setCallbacks(mExecutor, mNegativeButtonListener, mAuthenticationCallback);
+
+ if (ignoreNextReset) {
+ bridge.ignoreNextReset();
+ }
+ }
+
+ /**
+ * Checks the handler bridge to see if we've received a result from the confirm device
+ * credential Settings activity. If so, handles that result by calling the appropriate
+ * authentication callback.
+ */
+ private void maybeHandleDeviceCredentialResult() {
+ // Only handle result from the original (not handler-hosted) prompt.
+ if (mIsHandlingDeviceCredential) {
+ return;
+ }
+
+ final DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null) {
+ switch (bridge.getDeviceCredentialResult()) {
+ case DeviceCredentialHandlerBridge.RESULT_SUCCESS:
+ // Device credential auth succeeded. This is incompatible with crypto.
+ mAuthenticationCallback.onAuthenticationSucceeded(
+ new BiometricPrompt.AuthenticationResult(null /* crypto */));
+ bridge.stopIgnoringReset();
+ bridge.reset();
+ break;
+
+ case DeviceCredentialHandlerBridge.RESULT_ERROR:
+ // Device credential auth failed. Assume this is due to the user canceling.
+ final CharSequence errorMsg = getActivity() != null
+ ? getActivity().getString(R.string.generic_error_user_canceled) : "";
+ mAuthenticationCallback.onAuthenticationError(
+ BiometricConstants.ERROR_USER_CANCELED, errorMsg);
+ bridge.stopIgnoringReset();
+ bridge.reset();
+ break;
+ }
+ }
+ }
+
+ /** Cleans up the device credential handler bridge (if it exists) to avoid leaking memory. */
+ private void maybeResetHandlerBridge() {
+ final DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null) {
+ bridge.reset();
}
}
/** Checks if the client is currently changing configurations (e.g., screen orientation). */
private boolean isChangingConfigurations() {
- return (mFragmentActivity != null && mFragmentActivity.isChangingConfigurations())
- || (mFragment != null && mFragment.getActivity() != null
- && mFragment.getActivity().isChangingConfigurations());
+ return getActivity() != null && getActivity().isChangingConfigurations();
+ }
+
+ /** Gets the client activity that is hosting the biometric prompt. */
+ @Nullable
+ private FragmentActivity getActivity() {
+ return mFragmentActivity != null ? mFragmentActivity : mFragment.getActivity();
}
/**
@@ -722,8 +910,26 @@
* manager for a client activity or the child fragment manager for a client fragment.
*/
private FragmentManager getFragmentManager() {
- return mFragmentActivity != null
- ? mFragmentActivity.getSupportFragmentManager()
+ return mFragmentActivity != null ? mFragmentActivity.getSupportFragmentManager()
: mFragment.getChildFragmentManager();
}
+
+ /**
+ * @return True if the prompt handles authentication via {@link BiometricFragment}, or false
+ * if it does so via {@link FingerprintDialogFragment}.
+ */
+ private static boolean usingBiometricFragment() {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT;
+ }
+
+ /**
+ * Dismisses the given {@link FingerprintDialogFragment} and {@link FingerprintHelperFragment},
+ * both of which must be non-null.
+ */
+ private static void dismissFingerprintFragments(
+ @NonNull FingerprintDialogFragment fingerprintDialogFragment,
+ @NonNull FingerprintHelperFragment fingerprintHelperFragment) {
+ fingerprintDialogFragment.dismiss();
+ fingerprintHelperFragment.cancel(FingerprintHelperFragment.USER_CANCELED_FROM_NONE);
+ }
}
diff --git a/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerActivity.java b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerActivity.java
new file mode 100644
index 0000000..4d8f784
--- /dev/null
+++ b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerActivity.java
@@ -0,0 +1,100 @@
+/*
+ * 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.biometric;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.appcompat.app.AppCompatActivity;
+
+/**
+ * Transparent activity that is responsible for re-launching the {@link BiometricPrompt} and
+ * handling results from {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(
+ * CharSequence, CharSequence)} in order to allow device credential authentication prior to Q.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("SyntheticAccessor")
+public class DeviceCredentialHandlerActivity extends AppCompatActivity {
+ private static final String TAG = "DeviceCredentialHandler";
+
+ static final String EXTRA_PROMPT_INFO_BUNDLE = "prompt_info_bundle";
+
+ @Nullable
+ private DeviceCredentialHandlerBridge mBridge;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ // Apply the client activity's theme to ensure proper dialog styling.
+ DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null && bridge.getClientThemeResId() != 0) {
+ setTheme(bridge.getClientThemeResId());
+ getTheme().applyStyle(R.style.TransparentStyle, true /* force */);
+ }
+
+ // Must be called after setting the theme.
+ super.onCreate(savedInstanceState);
+ setTitle(null);
+ setContentView(R.layout.device_credential_handler_activity);
+
+ mBridge = DeviceCredentialHandlerBridge.getInstance();
+ if (mBridge.getExecutor() == null || mBridge.getAuthenticationCallback() == null) {
+ Log.e(TAG, "onCreate: Executor and/or callback was null!");
+ } else {
+ // (Re)connect to and launch a biometric prompt within this activity.
+ final BiometricPrompt biometricPrompt = new BiometricPrompt(this,
+ mBridge.getExecutor(), mBridge.getAuthenticationCallback());
+ final Bundle infoBundle = getIntent().getBundleExtra(EXTRA_PROMPT_INFO_BUNDLE);
+ final BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo(infoBundle);
+ biometricPrompt.authenticate(info);
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ // Prevent the client from resetting the bridge in onPause if just changing configuration.
+ if (isChangingConfigurations() && mBridge != null) {
+ mBridge.ignoreNextReset();
+ }
+ }
+
+ // Handles the result of startActivity invoked by the attached BiometricPrompt.
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ // Handle result from ConfirmDeviceCredentialActivity.
+ if (mBridge == null || mBridge.getAuthenticationCallback() == null) {
+ Log.e(TAG, "onActivityResult: Bridge or callback was null!");
+ } else if (resultCode == RESULT_OK) {
+ mBridge.setDeviceCredentialResult(DeviceCredentialHandlerBridge.RESULT_SUCCESS);
+ } else {
+ // Treat any non-OK result as a user cancellation.
+ mBridge.setDeviceCredentialResult(DeviceCredentialHandlerBridge.RESULT_ERROR);
+ }
+
+ finish();
+ }
+}
diff --git a/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerBridge.java b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerBridge.java
new file mode 100644
index 0000000..4778afc
--- /dev/null
+++ b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerBridge.java
@@ -0,0 +1,285 @@
+/*
+ * 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.biometric;
+
+import android.annotation.SuppressLint;
+import android.content.DialogInterface;
+import android.os.Build;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.concurrent.Executor;
+
+/**
+ * Singleton class to facilitate communication between the {@link BiometricPrompt} for the client
+ * activity and the one attached to {@link DeviceCredentialHandlerActivity} when allowing device
+ * credential authentication prior to Q.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+class DeviceCredentialHandlerBridge {
+ @Nullable
+ private static DeviceCredentialHandlerBridge sInstance;
+
+ private int mClientThemeResId;
+
+ @Nullable
+ private BiometricFragment mBiometricFragment;
+
+ @Nullable
+ private FingerprintDialogFragment mFingerprintDialogFragment;
+
+ @Nullable
+ private FingerprintHelperFragment mFingerprintHelperFragment;
+
+ @Nullable
+ private Executor mExecutor;
+
+ @Nullable
+ private DialogInterface.OnClickListener mOnClickListener;
+
+ @Nullable
+ private BiometricPrompt.AuthenticationCallback mAuthenticationCallback;
+
+ // Possible results from launching the confirm device credential Settings activity.
+ static final int RESULT_NONE = 0;
+ static final int RESULT_SUCCESS = 1;
+ static final int RESULT_ERROR = 2;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({RESULT_NONE, RESULT_SUCCESS, RESULT_ERROR})
+ private @interface DeviceCredentialResult {}
+
+ private @DeviceCredentialResult int mDeviceCredentialResult = RESULT_NONE;
+
+ // States indicating whether and for how long to ignore calls to reset().
+ private static final int NOT_IGNORING_RESET = 0;
+ private static final int IGNORING_NEXT_RESET = 1;
+ private static final int IGNORING_RESET = 2;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({NOT_IGNORING_RESET, IGNORING_NEXT_RESET, IGNORING_RESET})
+ private @interface IgnoreResetState {}
+
+ private @IgnoreResetState int mIgnoreResetState = NOT_IGNORING_RESET;
+
+ // Private constructor to enforce singleton pattern.
+ private DeviceCredentialHandlerBridge() {
+ }
+
+ /** @return The singleton bridge, creating it if necessary. */
+ @NonNull
+ static DeviceCredentialHandlerBridge getInstance() {
+ if (sInstance == null) {
+ sInstance = new DeviceCredentialHandlerBridge();
+ }
+ return sInstance;
+ }
+
+ /** @return The singleton bridge if already created, or null otherwise. */
+ @Nullable
+ static DeviceCredentialHandlerBridge getInstanceIfNotNull() {
+ return sInstance;
+ }
+
+ /**
+ * Register the resource ID for the client activity's theme to the bridge. This will be used
+ * for styling dialogs and other views in the handler activity.
+ */
+ void setClientThemeResId(int clientThemeResId) {
+ mClientThemeResId = clientThemeResId;
+ }
+
+ /** @return See {@link #setClientThemeResId(int)}. */
+ int getClientThemeResId() {
+ return mClientThemeResId;
+ }
+
+ /**
+ * Registers a {@link BiometricFragment} to the bridge. This will automatically receive new
+ * callbacks set by {@link #setCallbacks(Executor, DialogInterface.OnClickListener,
+ * BiometricPrompt.AuthenticationCallback)}.
+ */
+ void setBiometricFragment(@Nullable BiometricFragment biometricFragment) {
+ mBiometricFragment = biometricFragment;
+ }
+
+ /** @return See {@link #setBiometricFragment(BiometricFragment)}. */
+ @Nullable
+ BiometricFragment getBiometricFragment() {
+ return mBiometricFragment;
+ }
+
+ /**
+ * Registers a {@link FingerprintDialogFragment} and {@link FingerprintHelperFragment} to the
+ * bridge. These will automatically receive new callbacks set by {@link #setCallbacks(Executor,
+ * DialogInterface.OnClickListener, BiometricPrompt.AuthenticationCallback)}.
+ */
+ void setFingerprintFragments(@Nullable FingerprintDialogFragment fingerprintDialogFragment,
+ @Nullable FingerprintHelperFragment fingerprintHelperFragment) {
+ mFingerprintDialogFragment = fingerprintDialogFragment;
+ mFingerprintHelperFragment = fingerprintHelperFragment;
+ }
+
+ /**
+ * @return The latest {@link FingerprintDialogFragment} set via
+ * {@link #setFingerprintFragments(FingerprintDialogFragment, FingerprintHelperFragment)}.
+ */
+ @Nullable
+ public FingerprintDialogFragment getFingerprintDialogFragment() {
+ return mFingerprintDialogFragment;
+ }
+
+ /**
+ * @return The latest {@link FingerprintHelperFragment} set via
+ * {@link #setFingerprintFragments(FingerprintDialogFragment, FingerprintHelperFragment)}.
+ */
+ @Nullable
+ public FingerprintHelperFragment getFingerprintHelperFragment() {
+ return mFingerprintHelperFragment;
+ }
+
+ /**
+ * Registers dialog and authentication callbacks to the bridge, along with an executor that can
+ * be used to run them.
+ *
+ * If a {@link BiometricFragment} has been registered via
+ * {@link #setBiometricFragment(BiometricFragment)}, or if a {@link FingerprintDialogFragment}
+ * and {@link FingerprintHelperFragment} have been registered via
+ * {@link #setFingerprintFragments(FingerprintDialogFragment, FingerprintHelperFragment)}, then
+ * these fragments will receive the updated executor and callbacks as well.
+ *
+ * @param executor An executor that can be used to run callbacks.
+ * @param onClickListener A dialog button listener for a biometric prompt.
+ * @param authenticationCallback A handler for various biometric prompt authentication events.
+ */
+ @SuppressLint("LambdaLast")
+ void setCallbacks(@NonNull Executor executor,
+ @NonNull DialogInterface.OnClickListener onClickListener,
+ @NonNull BiometricPrompt.AuthenticationCallback authenticationCallback) {
+ mExecutor = executor;
+ mOnClickListener = onClickListener;
+ mAuthenticationCallback = authenticationCallback;
+ if (mBiometricFragment != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ mBiometricFragment.setCallbacks(executor, onClickListener, authenticationCallback);
+ } else if (mFingerprintDialogFragment != null && mFingerprintHelperFragment != null) {
+ mFingerprintDialogFragment.setNegativeButtonListener(onClickListener);
+ mFingerprintHelperFragment.setCallback(executor, authenticationCallback);
+ mFingerprintHelperFragment.setHandler(mFingerprintDialogFragment.getHandler());
+ }
+ }
+
+ /**
+ * @return The latest {@link Executor} set via {@link #setCallbacks(Executor,
+ * DialogInterface.OnClickListener, BiometricPrompt.AuthenticationCallback)}.
+ */
+ @Nullable
+ Executor getExecutor() {
+ return mExecutor;
+ }
+
+ /**
+ * @return The latest {@link DialogInterface.OnClickListener} set via {@link #setCallbacks(
+ * Executor, DialogInterface.OnClickListener, BiometricPrompt.AuthenticationCallback)}.
+ */
+ @Nullable
+ DialogInterface.OnClickListener getOnClickListener() {
+ return mOnClickListener;
+ }
+
+ /**
+ * @return The latest {@link BiometricPrompt.AuthenticationCallback} set via
+ * {@link #setCallbacks(Executor, DialogInterface.OnClickListener,
+ * BiometricPrompt.AuthenticationCallback)}.
+ */
+ @Nullable
+ BiometricPrompt.AuthenticationCallback getAuthenticationCallback() {
+ return mAuthenticationCallback;
+ }
+
+ /**
+ * Stores the authentication result from launching the confirm device credential Settings
+ * activity. This is intended for the client's {@link BiometricPrompt} instance to read this
+ * result and invoke the appropriate authentication callback method.
+ */
+ void setDeviceCredentialResult(int deviceCredentialResult) {
+ mDeviceCredentialResult = deviceCredentialResult;
+ }
+
+ /** @return See {@link #setDeviceCredentialResult(int)}. */
+ int getDeviceCredentialResult() {
+ return mDeviceCredentialResult;
+ }
+
+ /**
+ * Indicates that the bridge should ignore the next call to {@link #reset}. Calling this method
+ * after {@link #startIgnoringReset()} but before {@link #stopIgnoringReset()} has no effect.
+ */
+ void ignoreNextReset() {
+ if (mIgnoreResetState == NOT_IGNORING_RESET) {
+ mIgnoreResetState = IGNORING_NEXT_RESET;
+ }
+ }
+
+ /**
+ * Indicates that the bridge should ignore all subsequent calls to {@link #reset} until
+ * {@link #stopIgnoringReset()} is called.
+ */
+ void startIgnoringReset() {
+ mIgnoreResetState = IGNORING_RESET;
+ }
+
+ /**
+ * When called after {@link #ignoreNextReset()} or {@link #startIgnoringReset()}, allows
+ * subsequent calls to {@link #reset} to go through as normal, until either is called again.
+ */
+ void stopIgnoringReset() {
+ mIgnoreResetState = NOT_IGNORING_RESET;
+ }
+
+ /**
+ * Clears all data associated with the bridge, returning it to its default state.
+ *
+ * Note that calls to this method may be ignored if {@link #ignoreNextReset()} or
+ * {@link #startIgnoringReset()} has been called without a corresponding call to
+ * {@link #stopIgnoringReset()}.
+ */
+ void reset() {
+ if (mIgnoreResetState == IGNORING_RESET) {
+ return;
+ }
+
+ if (mIgnoreResetState == IGNORING_NEXT_RESET) {
+ stopIgnoringReset();
+ return;
+ }
+
+ mBiometricFragment = null;
+ mFingerprintDialogFragment = null;
+ mFingerprintHelperFragment = null;
+ mExecutor = null;
+ mOnClickListener = null;
+ mAuthenticationCallback = null;
+ sInstance = null;
+ }
+}
diff --git a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
index a46d54c..286958a 100644
--- a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
+++ b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
@@ -16,9 +16,12 @@
package androidx.biometric;
+import android.annotation.SuppressLint;
import android.app.Dialog;
+import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.AnimatedVectorDrawable;
@@ -27,29 +30,35 @@
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
+import android.util.Log;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentActivity;
/**
* This class implements a custom AlertDialog that prompts the user for fingerprint authentication.
* This class is not meant to be preserved across process death; for security reasons, the
* BiometricPromptCompat will automatically dismiss the dialog when the activity is no longer in the
* foreground.
+ *
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("SyntheticAccessor")
public class FingerprintDialogFragment extends DialogFragment {
- private static final String TAG = "FingerprintDialogFragment";
+ private static final String TAG = "FingerprintDialogFrag";
private static final String KEY_DIALOG_BUNDLE = "SavedBundle";
/**
@@ -58,21 +67,21 @@
* Error messages will be propagated back to the application via AuthenticationCallback
* after this amount of time.
*/
- protected static final int HIDE_DIALOG_DELAY = 2000; // ms
+ static final int HIDE_DIALOG_DELAY = 2000; // ms
// Shows a temporary message in the help area
- protected static final int MSG_SHOW_HELP = 1;
+ static final int MSG_SHOW_HELP = 1;
// Show an error in the help area, and dismiss the dialog afterwards
- protected static final int MSG_SHOW_ERROR = 2;
+ static final int MSG_SHOW_ERROR = 2;
// Dismisses the authentication dialog
- protected static final int MSG_DISMISS_DIALOG_ERROR = 3;
+ static final int MSG_DISMISS_DIALOG_ERROR = 3;
// Resets the help message
- protected static final int MSG_RESET_MESSAGE = 4;
+ static final int MSG_RESET_MESSAGE = 4;
// Dismisses the authentication dialog after success.
- protected static final int MSG_DISMISS_DIALOG_AUTHENTICATED = 5;
+ static final int MSG_DISMISS_DIALOG_AUTHENTICATED = 5;
// The amount of time required that this fragment be displayed for in order that
// we show an error message on top of the UI.
- protected static final int DISPLAYED_FOR_500_MS = 6;
+ static final int DISPLAYED_FOR_500_MS = 6;
// States for icon animation
private static final int STATE_NONE = 0;
@@ -83,7 +92,7 @@
/**
* Creates a dialog requesting for Fingerprint authentication.
*/
- public static FingerprintDialogFragment newInstance() {
+ static FingerprintDialogFragment newInstance() {
FingerprintDialogFragment fragment = new FingerprintDialogFragment();
return fragment;
}
@@ -123,20 +132,79 @@
private TextView mErrorText;
private Context mContext;
- private Dialog mDialog;
+
/**
* This flag is used to control the instant dismissal of the dialog fragment. In the case where
* the user is already locked out this dialog will not appear. In the case where the user is
* being locked out for the first time an error message will be displayed on the UI before
* dismissing.
*/
- protected boolean mDismissInstantly = true;
+ private boolean mDismissInstantly = true;
// This should be re-set by the BiometricPromptCompat each time the lifecycle changes.
- DialogInterface.OnClickListener mNegativeButtonListener;
+ private DialogInterface.OnClickListener mNegativeButtonListener;
+
+ // Also created once and retained.
+ @SuppressWarnings("deprecation")
+ private final DialogInterface.OnClickListener mDeviceCredentialButtonListener =
+ (dialog, which) -> {
+ if (which == DialogInterface.BUTTON_NEGATIVE) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ Log.e(TAG, "Failed to check device credential. Not supported prior to L.");
+ return;
+ }
+
+ final FragmentActivity activity = getActivity();
+ if (!(activity instanceof DeviceCredentialHandlerActivity)) {
+ Log.e(TAG, "Failed to check device credential. Parent handler not found.");
+ return;
+ }
+
+ final Object service = activity.getSystemService(Context.KEYGUARD_SERVICE);
+ if (!(service instanceof KeyguardManager)) {
+ Log.e(TAG, "Failed to check device credential. KeyguardManager not found.");
+ return;
+ }
+ final KeyguardManager km = (KeyguardManager) service;
+
+ // Dismiss the fingerprint dialog without forwarding errors to the client.
+ final FingerprintHelperFragment fingerprintHelperFragment =
+ (FingerprintHelperFragment) getFragmentManager().findFragmentByTag(
+ BiometricPrompt.FINGERPRINT_HELPER_FRAGMENT_TAG);
+ if (fingerprintHelperFragment != null) {
+ fingerprintHelperFragment.setConfirmingDeviceCredential(true);
+ }
+ onCancel(dialog);
+
+ // Pass along the title and subtitle from the biometric prompt.
+ final CharSequence title;
+ final CharSequence subtitle;
+ if (mBundle != null) {
+ title = mBundle.getCharSequence(BiometricPrompt.KEY_TITLE);
+ subtitle = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
+ } else {
+ title = null;
+ subtitle = null;
+ }
+
+ // Prevent the bridge from resetting until the confirmation activity finishes.
+ DeviceCredentialHandlerBridge bridge =
+ DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+ if (bridge != null) {
+ bridge.startIgnoringReset();
+ }
+
+ // Launch a new instance of the confirm device credential Settings activity.
+ final Intent intent = km.createConfirmDeviceCredentialIntent(title, subtitle);
+ intent.setFlags(
+ Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+ activity.startActivityForResult(intent, 0 /* requestCode */);
+ }
+ };
@Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
+ @NonNull
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null && mBundle == null) {
mBundle = savedInstanceState.getBundle(KEY_DIALOG_BUNDLE);
}
@@ -174,30 +242,33 @@
mErrorText = layout.findViewById(R.id.fingerprint_error);
final CharSequence negativeButtonText =
- mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
- builder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (mNegativeButtonListener != null) {
- mNegativeButtonListener.onClick(dialog, which);
- }
+ isDeviceCredentialAllowed()
+ ? getString(R.string.confirm_device_credential_password)
+ : mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
+ builder.setNegativeButton(negativeButtonText, (dialog, which) -> {
+ if (isDeviceCredentialAllowed()) {
+ mDeviceCredentialButtonListener.onClick(dialog, which);
+ } else if (mNegativeButtonListener != null) {
+ mNegativeButtonListener.onClick(dialog, which);
+ } else {
+ Log.w(TAG, "No suitable negative button listener.");
}
});
builder.setView(layout);
- mDialog = builder.create();
- mDialog.setCanceledOnTouchOutside(false);
- return mDialog;
+ Dialog dialog = builder.create();
+ dialog.setCanceledOnTouchOutside(false);
+ return dialog;
}
@Override
- public void onSaveInstanceState(Bundle outState) {
+ public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBundle(KEY_DIALOG_BUNDLE, mBundle);
}
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getContext();
@@ -224,9 +295,9 @@
}
@Override
- public void onCancel(DialogInterface dialog) {
+ public void onCancel(@NonNull DialogInterface dialog) {
super.onCancel(dialog);
- FingerprintHelperFragment fingerprintHelperFragment = (FingerprintHelperFragment)
+ final FingerprintHelperFragment fingerprintHelperFragment = (FingerprintHelperFragment)
getFragmentManager()
.findFragmentByTag(BiometricPrompt.FINGERPRINT_HELPER_FRAGMENT_TAG);
if (fingerprintHelperFragment != null) {
@@ -234,7 +305,7 @@
}
}
- public void setBundle(Bundle bundle) {
+ public void setBundle(@NonNull Bundle bundle) {
mBundle = bundle;
}
@@ -254,27 +325,27 @@
* the dialog persists through rotation, this allows us to return this as the error text for
* ERROR_NEGATIVE_BUTTON.
*/
+ @Nullable
protected CharSequence getNegativeButtonText() {
return mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
}
- /**
- * Sets the negative button listener.
- * @param listener
- */
- protected void setNegativeButtonListener(DialogInterface.OnClickListener listener) {
+ void setNegativeButtonListener(DialogInterface.OnClickListener listener) {
mNegativeButtonListener = listener;
}
/**
- * Returns the handler; the handler is used by FingerprintHelperFragment to notify the UI of
+ * @return The handler; the handler is used by FingerprintHelperFragment to notify the UI of
* changes from Fingerprint callbacks.
- * @return
*/
- protected Handler getHandler() {
+ Handler getHandler() {
return mHandler;
}
+ boolean isDeviceCredentialAllowed() {
+ return mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL);
+ }
+
private boolean shouldAnimateForTransition(int oldState, int newState) {
if (oldState == STATE_NONE && newState == STATE_FINGERPRINT) {
return false;
@@ -289,7 +360,7 @@
return false;
}
- @RequiresApi(21)
+ @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private Drawable getAnimationForTransition(int oldState, int newState) {
int iconRes;
@@ -332,7 +403,7 @@
}
}
- void handleShowHelp(CharSequence msg) {
+ private void handleShowHelp(CharSequence msg) {
updateFingerprintIcon(STATE_FINGERPRINT_ERROR);
mHandler.removeMessages(MSG_RESET_MESSAGE);
mErrorText.setTextColor(mErrorColor);
@@ -342,7 +413,7 @@
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE), HIDE_DIALOG_DELAY);
}
- void handleShowError(int errMsgId, CharSequence msg) {
+ private void handleShowError(int errMsgId, CharSequence msg) {
updateFingerprintIcon(STATE_FINGERPRINT_ERROR);
mHandler.removeMessages(MSG_RESET_MESSAGE);
mErrorText.setTextColor(mErrorColor);
@@ -353,19 +424,13 @@
HIDE_DIALOG_DELAY);
}
- void dismissAfterDelay() {
+ private void dismissAfterDelay() {
mErrorText.setTextColor(mErrorColor);
- mErrorText.setText(
- R.string.fingerprint_error_lockout);
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- dismiss();
- }
- }, HIDE_DIALOG_DELAY);
+ mErrorText.setText(R.string.fingerprint_error_lockout);
+ mHandler.postDelayed(this::dismiss, HIDE_DIALOG_DELAY);
}
- void handleDismissDialogError() {
+ private void handleDismissDialogError() {
if (mDismissInstantly) {
dismiss();
} else {
@@ -376,7 +441,7 @@
mDismissInstantly = true;
}
- void handleResetMessage() {
+ private void handleResetMessage() {
updateFingerprintIcon(STATE_FINGERPRINT);
mErrorText.setTextColor(mTextColor);
mErrorText.setText(mContext.getString(R.string.fingerprint_dialog_touch_sensor));
diff --git a/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java b/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java
index 219e3c4..173c607 100644
--- a/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java
+++ b/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java
@@ -16,6 +16,7 @@
package androidx.biometric;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
@@ -24,9 +25,12 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.core.os.CancellationSignal;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
import java.util.concurrent.Executor;
@@ -35,34 +39,39 @@
* across device configuration changes. This class is not meant to be preserved after process death;
* for security reasons, the BiometricPromptCompat will automatically stop authentication when the
* activity is no longer in the foreground.
+ *
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("SyntheticAccessor")
public class FingerprintHelperFragment extends Fragment {
- private static final String TAG = "fh_fragment";
+ private static final String TAG = "FingerprintHelperFrag";
- protected static final int USER_CANCELED_FROM_NONE = 0;
- protected static final int USER_CANCELED_FROM_USER = 1;
- protected static final int USER_CANCELED_FROM_NEGATIVE_BUTTON = 2;
+ static final int USER_CANCELED_FROM_NONE = 0;
+ static final int USER_CANCELED_FROM_USER = 1;
+ static final int USER_CANCELED_FROM_NEGATIVE_BUTTON = 2;
// Re-set by the application, through BiometricPromptCompat upon orientation changes.
- Executor mExecutor;
- BiometricPrompt.AuthenticationCallback mClientAuthenticationCallback;
+ private Executor mExecutor;
+ private BiometricPrompt.AuthenticationCallback mClientAuthenticationCallback;
// Re-set by BiometricPromptCompat upon orientation changes. This handler is used to send
// messages from the AuthenticationCallbacks to the UI.
- Handler mHandler;
+ private Handler mHandler;
// Set once and retained.
private boolean mShowing;
private BiometricPrompt.CryptoObject mCryptoObject;
// Created once and retained.
- Context mContext;
- int mCanceledFrom;
+ private Context mContext;
+ private int mCanceledFrom;
private CancellationSignal mCancellationSignal;
+ // Whether this fragment is launching the confirm device credential Settings activity.
+ private boolean mConfirmingDeviceCredential;
+
// Also created once and retained.
@SuppressWarnings("deprecation")
private final androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback
@@ -73,13 +82,11 @@
final CharSequence errString) {
mHandler.obtainMessage(FingerprintDialogFragment.MSG_DISMISS_DIALOG_ERROR)
.sendToTarget();
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mClientAuthenticationCallback
- .onAuthenticationError(errMsgId, errString);
- }
- });
+ if (!mConfirmingDeviceCredential) {
+ mExecutor.execute(
+ () -> mClientAuthenticationCallback.onAuthenticationError(errMsgId,
+ errString));
+ }
}
@Override
@@ -110,18 +117,12 @@
mHandler.obtainMessage(FingerprintDialogFragment.MSG_SHOW_ERROR,
errMsgIdToSend, 0, errStringNonNull).sendToTarget();
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mClientAuthenticationCallback.onAuthenticationError(
- errMsgIdToSend, errStringNonNull);
- }
- });
- }
- }, FingerprintDialogFragment.HIDE_DIALOG_DELAY);
+ if (!mConfirmingDeviceCredential) {
+ mHandler.postDelayed(() -> mExecutor.execute(
+ () -> mClientAuthenticationCallback.onAuthenticationError(
+ errMsgIdToSend, errStringNonNull)),
+ FingerprintDialogFragment.HIDE_DIALOG_DELAY);
+ }
}
cleanup();
}
@@ -140,14 +141,9 @@
mHandler.obtainMessage(
FingerprintDialogFragment.MSG_DISMISS_DIALOG_AUTHENTICATED)
.sendToTarget();
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mClientAuthenticationCallback.onAuthenticationSucceeded(
- new BiometricPrompt.AuthenticationResult(
- unwrapCryptoObject(result.getCryptoObject())));
- }
- });
+ mExecutor.execute(() -> mClientAuthenticationCallback.onAuthenticationSucceeded(
+ new BiometricPrompt.AuthenticationResult(
+ unwrapCryptoObject(result.getCryptoObject()))));
cleanup();
}
@@ -156,19 +152,14 @@
mHandler.obtainMessage(FingerprintDialogFragment.MSG_SHOW_HELP,
mContext.getResources().getString(R.string.fingerprint_not_recognized))
.sendToTarget();
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mClientAuthenticationCallback.onAuthenticationFailed();
- }
- });
+ mExecutor.execute(mClientAuthenticationCallback::onAuthenticationFailed);
}
};
/**
* Creates a new instance of the {@link FingerprintHelperFragment}.
*/
- public static FingerprintHelperFragment newInstance() {
+ static FingerprintHelperFragment newInstance() {
return new FingerprintHelperFragment();
}
@@ -176,22 +167,22 @@
* Sets the crypto object to be associated with the authentication. Should be called before
* adding the fragment to guarantee that it's ready in onCreate().
*/
- public void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
+ void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
mCryptoObject = crypto;
}
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mContext = getContext();
-
}
@Override
@SuppressWarnings("deprecation")
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
+ @Nullable
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
if (!mShowing) {
mCancellationSignal = new CancellationSignal();
mCanceledFrom = USER_CANCELED_FROM_NONE;
@@ -218,7 +209,7 @@
* Sets the client's callback. This should be done whenever the lifecycle changes (orientation
* changes).
*/
- protected void setCallback(Executor executor,
+ void setCallback(Executor executor,
BiometricPrompt.AuthenticationCallback callback) {
mExecutor = executor;
mClientAuthenticationCallback = callback;
@@ -227,15 +218,23 @@
/**
* Pass a reference to the handler used by FingerprintDialogFragment to update the UI.
*/
- protected void setHandler(Handler handler) {
+ void setHandler(Handler handler) {
mHandler = handler;
}
/**
+ * Indicates whether this fragment has or is about to launch the confirm device credential
+ * Settings activity and should therefore stop sending error signals back to the client.
+ */
+ void setConfirmingDeviceCredential(boolean confirmingDeviceCredential) {
+ mConfirmingDeviceCredential = confirmingDeviceCredential;
+ }
+
+ /**
* Cancel the authentication.
* @param canceledFrom one of the USER_CANCELED_FROM* constants
*/
- protected void cancel(int canceledFrom) {
+ void cancel(int canceledFrom) {
mCanceledFrom = canceledFrom;
if (canceledFrom == USER_CANCELED_FROM_USER) {
sendErrorToClient(BiometricPrompt.ERROR_USER_CANCELED);
@@ -250,11 +249,15 @@
/**
* Remove the fragment so that resources can be freed.
*/
- void cleanup() {
+ private void cleanup() {
mShowing = false;
+ FragmentActivity activity = getActivity();
if (getFragmentManager() != null) {
getFragmentManager().beginTransaction().detach(this).commitAllowingStateLoss();
}
+ if (!mConfirmingDeviceCredential) {
+ Utils.maybeFinishHandler(activity);
+ }
}
/**
@@ -277,10 +280,14 @@
/**
* Bypasses the FingerprintManager authentication callback wrapper and sends it directly to the
* client's callback, since the UI is not even showing yet.
- * @param error
+ *
+ * @param error The error code that will be sent to the client.
*/
private void sendErrorToClient(final int error) {
- mClientAuthenticationCallback.onAuthenticationError(error, getErrorString(mContext, error));
+ if (!mConfirmingDeviceCredential) {
+ mClientAuthenticationCallback.onAuthenticationError(error,
+ getErrorString(mContext, error));
+ }
}
/**
@@ -304,7 +311,7 @@
}
@SuppressWarnings("deprecation")
- static BiometricPrompt.CryptoObject unwrapCryptoObject(
+ private static BiometricPrompt.CryptoObject unwrapCryptoObject(
androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject cryptoObject) {
if (cryptoObject == null) {
return null;
@@ -320,7 +327,7 @@
}
@SuppressWarnings("deprecation")
- static androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject
+ private static androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject
wrapCryptoObject(BiometricPrompt.CryptoObject cryptoObject) {
if (cryptoObject == null) {
return null;
diff --git a/biometric/src/main/java/androidx/biometric/Utils.java b/biometric/src/main/java/androidx/biometric/Utils.java
index 5782399..0fa34f91 100644
--- a/biometric/src/main/java/androidx/biometric/Utils.java
+++ b/biometric/src/main/java/androidx/biometric/Utils.java
@@ -16,7 +16,9 @@
package androidx.biometric;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
+import androidx.fragment.app.FragmentActivity;
/**
* @hide
@@ -48,4 +50,14 @@
return true;
}
}
+
+ /**
+ * Finishes a given activity if and only if it's a {@link DeviceCredentialHandlerActivity}.
+ * @param activity The activity to finish.
+ */
+ public static void maybeFinishHandler(@Nullable FragmentActivity activity) {
+ if (activity instanceof DeviceCredentialHandlerActivity && !activity.isFinishing()) {
+ activity.finish();
+ }
+ }
}
diff --git a/browser/build.gradle b/browser/build.gradle
index 06018de..5dd3789 100644
--- a/browser/build.gradle
+++ b/browser/build.gradle
@@ -17,7 +17,7 @@
}
dependencies {
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
api("androidx.annotation:annotation:1.1.0")
implementation("androidx.collection:collection:1.1.0")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index b4bd916..d0311b6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -33,7 +33,7 @@
val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
val AUTOFILL = Version("1.0.0-alpha03")
val BENCHMARK = Version("1.0.0-alpha05")
- val BIOMETRIC = Version("1.0.0-beta01")
+ val BIOMETRIC = Version("1.0.0-alpha06")
val BROWSER = Version("1.2.0-alpha08")
val CAMERA = Version("1.0.0-alpha05")
val CAMERA_EXTENSIONS = Version("1.0.0-alpha02")
@@ -87,10 +87,10 @@
val PERCENTLAYOUT = Version("1.1.0-alpha01")
val PREFERENCE = Version("1.2.0-alpha01")
val RECOMMENDATION = Version("1.1.0-alpha01")
- val RECYCLERVIEW = Version("1.1.0-beta03")
+ val RECYCLERVIEW = Version("1.1.0-beta04")
val RECYCLERVIEW_SELECTION = Version("1.1.0-alpha07")
val REMOTECALLBACK = Version("1.0.0-alpha02")
- val ROOM = Version("2.2.0-alpha03")
+ val ROOM = Version("2.2.0-beta01")
val SAVEDSTATE = Version("1.0.0-rc01")
val SECURITY = Version("1.0.0-alpha03")
val SECURITY_IDENTITY_CREDENTIAL = Version("1.0.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index b0b0c27..9c03f27 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -31,7 +31,7 @@
prebuilts(LibraryGroups.ACTIVITY, "1.1.0-alpha02")
prebuilts(LibraryGroups.ADS, "1.0.0-alpha01")
prebuilts(LibraryGroups.ANNOTATION, "annotation", "1.1.0")
- prebuilts(LibraryGroups.APPCOMPAT, "1.1.0-rc01")
+ prebuilts(LibraryGroups.APPCOMPAT, "1.1.0")
prebuilts(LibraryGroups.ARCH_CORE, "2.1.0")
prebuilts(LibraryGroups.ASYNCLAYOUTINFLATER, "1.0.0")
prebuilts(LibraryGroups.AUTOFILL, "1.0.0-alpha02")
@@ -79,10 +79,10 @@
ignore(LibraryGroups.LOADER.group, "loader-ktx")
prebuilts(LibraryGroups.LOADER, "1.1.0-rc01")
prebuilts(LibraryGroups.LOCALBROADCASTMANAGER, "1.1.0-alpha01")
- prebuilts(LibraryGroups.MEDIA, "media", "1.1.0-rc01")
+ prebuilts(LibraryGroups.MEDIA, "media", "1.1.0")
ignore(LibraryGroups.MEDIA2.group, "media2-exoplayer")
- prebuilts(LibraryGroups.MEDIA2, "media2-widget", "1.0.0-beta01")
- prebuilts(LibraryGroups.MEDIA2, "1.0.0-rc01")
+ prebuilts(LibraryGroups.MEDIA2, "media2-widget", "1.0.0-rc02")
+ prebuilts(LibraryGroups.MEDIA2, "1.0.0-rc02")
prebuilts(LibraryGroups.MEDIAROUTER, "1.1.0-rc01")
ignore(LibraryGroups.NAVIGATION.group, "navigation-testing")
ignore(LibraryGroups.NAVIGATION.group, "navigation-dynamic-feature")
@@ -99,7 +99,7 @@
prebuilts(LibraryGroups.RECYCLERVIEW, "recyclerview", "1.1.0-beta03")
prebuilts(LibraryGroups.RECYCLERVIEW, "recyclerview-selection", "1.1.0-alpha06")
prebuilts(LibraryGroups.REMOTECALLBACK, "1.0.0-alpha02")
- prebuilts(LibraryGroups.ROOM, "2.2.0-alpha02")
+ prebuilts(LibraryGroups.ROOM, "2.2.0-beta01")
prebuilts(LibraryGroups.SAVEDSTATE, "1.0.0")
// TODO: Remove this ignore once androidx.security:security-identity-credential:1.0.0-alpha01 is released
ignore(LibraryGroups.SECURITY.group, "security-identity-credential")
@@ -118,8 +118,8 @@
prebuilts(LibraryGroups.TEXTCLASSIFIER, "1.0.0-alpha02")
prebuilts(LibraryGroups.TRANSITION, "1.2.0-beta01")
prebuilts(LibraryGroups.TVPROVIDER, "1.0.0")
- prebuilts(LibraryGroups.VECTORDRAWABLE, "1.1.0-rc01")
- prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0-rc01")
+ prebuilts(LibraryGroups.VECTORDRAWABLE, "1.1.0")
+ prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0")
prebuilts(LibraryGroups.VERSIONEDPARCELABLE, "1.1.0")
prebuilts(LibraryGroups.VIEWPAGER, "1.0.0")
prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-beta03")
@@ -128,7 +128,7 @@
prebuilts(LibraryGroups.WEBKIT, "1.1.0-alpha02")
ignore(LibraryGroups.WORK.group, "work-gcm")
ignore(LibraryGroups.WORK.group, "work-foreground")
- prebuilts(LibraryGroups.WORK, "2.2.0")
+ prebuilts(LibraryGroups.WORK, "2.3.0-alpha01")
default(Ignore)
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
index 1067c50..edc6fa0 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
@@ -186,7 +186,9 @@
// Never track @Experimental APIs.
args += listOf(
"--hide-annotation", "androidx.annotation.experimental.Experimental",
- "--hide-meta-annotation", "androidx.annotation.experimental.Experimental"
+ "--hide-annotation", "kotlin.Experimental",
+ "--hide-meta-annotation", "androidx.annotation.experimental.Experimental",
+ "--hide-meta-annotation", "kotlin.Experimental"
)
val metalavaConfiguration = getMetalavaConfiguration()
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index 2a15464..b13de44 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -27,7 +27,7 @@
dependencies {
api(project(":camera:camera-core"))
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation("androidx.annotation:annotation:1.0.0")
implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
implementation(GUAVA_LISTENABLE_FUTURE)
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java
index 3f31ab0..b337735 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java
@@ -25,10 +25,9 @@
import android.os.HandlerThread;
import android.util.Size;
-import androidx.camera.core.AppConfig;
+import androidx.camera.camera2.impl.Camera2CameraFactory;
import androidx.camera.core.BaseCamera;
import androidx.camera.core.CameraFactory;
-import androidx.camera.core.CameraX;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.ImageReaderProxy;
import androidx.camera.core.ImageReaderProxys;
@@ -44,6 +43,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -51,6 +51,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.Semaphore;
/**
@@ -60,7 +61,8 @@
@RunWith(AndroidJUnit4.class)
public final class ImageReaderProxysTest {
private static final String CAMERA_ID = "0";
- private static final int TEST_TIMEOUT_MILLIS = 3000;
+
+ private static CameraFactory sCameraFactory;
private BaseCamera mCamera;
private HandlerThread mHandlerThread;
@@ -81,27 +83,37 @@
};
}
+ @BeforeClass
+ public static void initializeFactory() {
+ Context context = ApplicationProvider.getApplicationContext();
+ sCameraFactory = new Camera2CameraFactory(context);
+ }
+
@Before
public void setUp() {
assumeTrue(CameraUtil.deviceHasCamera());
- Context context = ApplicationProvider.getApplicationContext();
- AppConfig appConfig = Camera2AppConfig.create(context);
- CameraFactory cameraFactory = appConfig.getCameraFactory(null);
- CameraX.init(context, appConfig);
- mCamera = cameraFactory.getCamera(CAMERA_ID);
+
mHandlerThread = new HandlerThread("Background");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
mReaders = new ArrayList<>();
+
+ // Grab the camera so we can wait for release in tearDown()
+
+ mCamera = sCameraFactory.getCamera(CAMERA_ID);
}
@After
- public void tearDown() {
+ public void tearDown() throws ExecutionException, InterruptedException {
for (ImageReaderProxy reader : mReaders) {
reader.close();
}
- if (mCamera != null && mHandlerThread != null) {
- mCamera.release();
+
+ if (mCamera != null) {
+ mCamera.release().get();
+ }
+
+ if (mHandlerThread != null) {
mHandlerThread.quitSafely();
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java
index 20ff7d5..9cb9210 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java
@@ -24,6 +24,7 @@
import android.os.Build;
import android.view.Surface;
+import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -43,6 +44,7 @@
}
/** Returns a session capture callback which does nothing. */
+ @NonNull
public static CameraCaptureSession.CaptureCallback createNoOpCallback() {
return new NoOpSessionCaptureCallback();
}
@@ -54,8 +56,9 @@
}
/** Returns a session capture callback which calls a list of other callbacks. */
+ @NonNull
public static CameraCaptureSession.CaptureCallback createComboCallback(
- CameraCaptureSession.CaptureCallback... callbacks) {
+ @NonNull CameraCaptureSession.CaptureCallback... callbacks) {
return createComboCallback(Arrays.asList(callbacks));
}
@@ -63,41 +66,45 @@
extends CameraCaptureSession.CaptureCallback {
@Override
public void onCaptureBufferLost(
- CameraCaptureSession session,
- CaptureRequest request,
- Surface surface,
+ @NonNull CameraCaptureSession session,
+ @NonNull CaptureRequest request,
+ @NonNull Surface surface,
long frame) {
}
@Override
public void onCaptureCompleted(
- CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull TotalCaptureResult result) {
}
@Override
public void onCaptureFailed(
- CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull CaptureFailure failure) {
}
@Override
public void onCaptureProgressed(
- CameraCaptureSession session,
- CaptureRequest request,
- CaptureResult partialResult) {
+ @NonNull CameraCaptureSession session,
+ @NonNull CaptureRequest request,
+ @NonNull CaptureResult partialResult) {
}
@Override
- public void onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId) {
+ public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
+ int sequenceId) {
}
@Override
public void onCaptureSequenceCompleted(
- CameraCaptureSession session, int sequenceId, long frame) {
+ @NonNull CameraCaptureSession session, int sequenceId, long frame) {
}
@Override
public void onCaptureStarted(
- CameraCaptureSession session, CaptureRequest request, long timestamp, long frame) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ long timestamp, long frame) {
}
}
@@ -117,7 +124,8 @@
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onCaptureBufferLost(
- CameraCaptureSession session, CaptureRequest request, Surface surface, long frame) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull Surface surface, long frame) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureBufferLost(session, request, surface, frame);
}
@@ -125,7 +133,8 @@
@Override
public void onCaptureCompleted(
- CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull TotalCaptureResult result) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureCompleted(session, request, result);
}
@@ -133,7 +142,8 @@
@Override
public void onCaptureFailed(
- CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull CaptureFailure failure) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureFailed(session, request, failure);
}
@@ -141,14 +151,16 @@
@Override
public void onCaptureProgressed(
- CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull CaptureResult partialResult) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureProgressed(session, request, partialResult);
}
}
@Override
- public void onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId) {
+ public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
+ int sequenceId) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureSequenceAborted(session, sequenceId);
}
@@ -156,7 +168,7 @@
@Override
public void onCaptureSequenceCompleted(
- CameraCaptureSession session, int sequenceId, long frame) {
+ @NonNull CameraCaptureSession session, int sequenceId, long frame) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureSequenceCompleted(session, sequenceId, frame);
}
@@ -164,7 +176,8 @@
@Override
public void onCaptureStarted(
- CameraCaptureSession session, CaptureRequest request, long timestamp, long frame) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ long timestamp, long frame) {
for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
callback.onCaptureStarted(session, request, timestamp, frame);
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java
index d2dd131..82622c7 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java
@@ -23,6 +23,7 @@
import android.net.Uri;
import android.util.Log;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.camera.camera2.Camera2AppConfig;
@@ -48,7 +49,7 @@
@Nullable
@Override
public Cursor query(
- Uri uri,
+ @NonNull Uri uri,
@Nullable String[] strings,
@Nullable String s,
@Nullable String[] strings1,
@@ -58,24 +59,24 @@
@Nullable
@Override
- public String getType(Uri uri) {
+ public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
- public Uri insert(Uri uri, @Nullable ContentValues contentValues) {
+ public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
return null;
}
@Override
- public int delete(Uri uri, @Nullable String s, @Nullable String[] strings) {
+ public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
return 0;
}
@Override
public int update(
- Uri uri,
+ @NonNull Uri uri,
@Nullable ContentValues contentValues,
@Nullable String s,
@Nullable String[] strings) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java
index ba38457..c881b2c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java
@@ -53,7 +53,8 @@
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onCaptureBufferLost(
- CameraCaptureSession session, CaptureRequest request, Surface surface, long frame) {
+ @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+ @NonNull Surface surface, long frame) {
for (CameraCaptureSession.CaptureCallback callback : getCallbacks(request)) {
callback.onCaptureBufferLost(session, request, surface, frame);
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
index a5187c8d..3955a31 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
@@ -40,15 +40,18 @@
}
/** Returns a camera event callback which calls a list of other callbacks. */
+ @NonNull
public ComboCameraEventCallback createComboCallback() {
return new ComboCameraEventCallback(getAllItems());
}
/** Returns a camera event callback which does nothing. */
+ @NonNull
public static CameraEventCallbacks createEmptyCallback() {
return new CameraEventCallbacks();
}
+ @NonNull
@Override
public MultiValueSet<CameraEventCallback> clone() {
CameraEventCallbacks ret = createEmptyCallback();
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index d792fc0..b111e0d 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -29,7 +29,7 @@
api("androidx.lifecycle:lifecycle-common:2.0.0")
implementation("androidx.exifinterface:exifinterface:1.0.0")
implementation("androidx.annotation:annotation:1.0.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
implementation(ARCH_LIFECYCLE_LIVEDATA)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java
index d27affa..89a1302 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java
@@ -18,6 +18,7 @@
import android.hardware.camera2.CameraDevice;
+import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -65,19 +66,19 @@
static final class NoOpDeviceStateCallback extends CameraDevice.StateCallback {
@Override
- public void onOpened(CameraDevice cameraDevice) {
+ public void onOpened(@NonNull CameraDevice cameraDevice) {
}
@Override
- public void onClosed(CameraDevice cameraDevice) {
+ public void onClosed(@NonNull CameraDevice cameraDevice) {
}
@Override
- public void onDisconnected(CameraDevice cameraDevice) {
+ public void onDisconnected(@NonNull CameraDevice cameraDevice) {
}
@Override
- public void onError(CameraDevice cameraDevice, int error) {
+ public void onError(@NonNull CameraDevice cameraDevice, int error) {
}
}
@@ -94,28 +95,28 @@
}
@Override
- public void onOpened(CameraDevice cameraDevice) {
+ public void onOpened(@NonNull CameraDevice cameraDevice) {
for (CameraDevice.StateCallback callback : mCallbacks) {
callback.onOpened(cameraDevice);
}
}
@Override
- public void onClosed(CameraDevice cameraDevice) {
+ public void onClosed(@NonNull CameraDevice cameraDevice) {
for (CameraDevice.StateCallback callback : mCallbacks) {
callback.onClosed(cameraDevice);
}
}
@Override
- public void onDisconnected(CameraDevice cameraDevice) {
+ public void onDisconnected(@NonNull CameraDevice cameraDevice) {
for (CameraDevice.StateCallback callback : mCallbacks) {
callback.onDisconnected(cameraDevice);
}
}
@Override
- public void onError(CameraDevice cameraDevice, int error) {
+ public void onError(@NonNull CameraDevice cameraDevice, int error) {
for (CameraDevice.StateCallback callback : mCallbacks) {
callback.onError(cameraDevice, error);
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 1302d0f..8d30323 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -566,6 +566,7 @@
mExecutor);
}
+ @NonNull
@Override
public String toString() {
return TAG + ":" + getName();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index b7f7f45..dc4dfd6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -38,6 +38,7 @@
import androidx.camera.core.ImageOutputConfig.RotationValue;
import com.google.auto.value.AutoValue;
+import com.google.common.util.concurrent.ListenableFuture;
import java.util.Map;
import java.util.Objects;
@@ -301,6 +302,7 @@
}
}
+ @NonNull
@Override
public String toString() {
return TAG + ":" + getName();
@@ -464,13 +466,40 @@
UNKNOWN_ERROR
}
- /** A listener of {@link PreviewOutput}. */
+ /**
+ * A listener of {@link PreviewOutput}.
+ *
+ * TODO(b/117519540): Mark as deprecated once PreviewSurfaceCallback is ready.
+ */
public interface OnPreviewOutputUpdateListener {
/** Callback when PreviewOutput has been updated. */
void onUpdated(PreviewOutput output);
}
/**
+ * A callback to access the Preview Surface.
+ */
+ public interface PreviewSurfaceCallback {
+
+ /**
+ * Get preview output Surface with the given resolution and format.
+ *
+ * <p> This is called when Preview needs a valid Surface. e.g. when the Preview is bound
+ * to lifecycle or the current Surface is no longer valid. When that happens, the
+ * implementation is required to create a Surface with the given resolution/format.
+ *
+ * <p> The Surface should be released after the use case is no longer active. If released
+ * prematurely, the implementation will be asked to provide a new Surface via this method.
+ *
+ * @param resolution the resolution required by CameraX.
+ * @param imageFormat the {@link ImageFormat} required by CameraX.
+ * @return A ListenableFuture that contains the user created Surface.
+ */
+ @NonNull
+ ListenableFuture<Surface> getSurface(@NonNull Size resolution, int imageFormat);
+ }
+
+ /**
* Provides a base static default configuration for the Preview
*
* <p>These values may be overridden by the implementation. They only provide a minimum set of
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
index e70e683..ce606be 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
@@ -18,6 +18,8 @@
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+
import com.google.auto.value.AutoValue;
import java.math.BigInteger;
@@ -76,6 +78,7 @@
abstract String getDescription();
+ @NonNull
@Override
public String toString() {
StringBuilder sb = new StringBuilder(getMajor() + "." + getMinor() + "." + getPatch());
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 87b88cc..718544f 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -30,7 +30,7 @@
implementation("androidx.annotation:annotation:1.0.0")
implementation(GUAVA_LISTENABLE_FUTURE)
implementation(project(":camera:camera-core"))
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
implementation(JUNIT)
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 553a0d8..5310c58 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -837,7 +837,7 @@
@Override
public void onRequestPermissionsResult(
- int requestCode, String[] permissions, int[] grantResults) {
+ int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSIONS_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index e767b76..8a5ec06 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -514,7 +514,7 @@
@Override
public void onRequestPermissionsResult(
- int requestCode, String[] permissions, int[] grantResults) {
+ int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSIONS_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
diff --git a/car/moderator/build.gradle b/car/moderator/build.gradle
index 4d19dbd..bd7370d 100644
--- a/car/moderator/build.gradle
+++ b/car/moderator/build.gradle
@@ -26,7 +26,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/content/build.gradle b/content/build.gradle
index cafb452..4a27186 100644
--- a/content/build.gradle
+++ b/content/build.gradle
@@ -26,7 +26,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(JUNIT)
diff --git a/coordinatorlayout/build.gradle b/coordinatorlayout/build.gradle
index ae2a733..67dfc84 100644
--- a/coordinatorlayout/build.gradle
+++ b/coordinatorlayout/build.gradle
@@ -10,8 +10,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- // TODO: change to 1.1.0-alpha04 after release
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
api("androidx.customview:customview:1.0.0")
diff --git a/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
index 5cf76a1..4fdc5d5 100644
--- a/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
+++ b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
@@ -22,7 +22,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <androidx.appcompat.widget.AppCompatTextView
+ <TextView
android:id="@+id/text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
@@ -31,7 +31,7 @@
android:textSize="18dip"
android:textStyle="bold"
android:padding="12dip"
- app:textAllCaps="true"
+ android:textAllCaps="true"
app:layout_behavior="androidx.coordinatorlayout.custom.TestFloatingBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/core/core/api/1.2.0-alpha04.txt b/core/core/api/1.2.0-alpha04.txt
index d39053e..fb12c76 100644
--- a/core/core/api/1.2.0-alpha04.txt
+++ b/core/core/api/1.2.0-alpha04.txt
@@ -916,6 +916,7 @@
method public android.content.Intent getIntent();
method public android.content.Intent![] getIntents();
method public CharSequence? getLongLabel();
+ method public int getRank();
method public CharSequence getShortLabel();
method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
}
@@ -931,9 +932,11 @@
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 @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
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 setRank(int);
method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
}
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index d39053e..fb12c76 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -916,6 +916,7 @@
method public android.content.Intent getIntent();
method public android.content.Intent![] getIntents();
method public CharSequence? getLongLabel();
+ method public int getRank();
method public CharSequence getShortLabel();
method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
}
@@ -931,9 +932,11 @@
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 @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
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 setRank(int);
method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
}
diff --git a/core/core/api/restricted_1.2.0-alpha04.txt b/core/core/api/restricted_1.2.0-alpha04.txt
index 7991be2..50fe0b6 100644
--- a/core/core/api/restricted_1.2.0-alpha04.txt
+++ b/core/core/api/restricted_1.2.0-alpha04.txt
@@ -1017,6 +1017,7 @@
method public android.content.Intent getIntent();
method public android.content.Intent![] getIntents();
method public CharSequence? getLongLabel();
+ method public int getRank();
method public CharSequence getShortLabel();
method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
}
@@ -1034,9 +1035,11 @@
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 @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
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 setRank(int);
method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
}
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 7991be2..50fe0b6 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1017,6 +1017,7 @@
method public android.content.Intent getIntent();
method public android.content.Intent![] getIntents();
method public CharSequence? getLongLabel();
+ method public int getRank();
method public CharSequence getShortLabel();
method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
}
@@ -1034,9 +1035,11 @@
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 @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
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 setRank(int);
method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
}
diff --git a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
index 516759c..6d00a7c 100644
--- a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
@@ -126,6 +126,7 @@
assertEquals(TEST_SHORTCUT_ID, compat.getId());
assertEquals(TEST_SHORTCUT_SHORT_LABEL, compat.getShortLabel());
assertEquals(mAction, compat.getIntent());
+ assertEquals(0, compat.getRank());
assertNull(compat.getLongLabel());
assertNull(compat.getDisabledMessage());
assertNull(compat.getActivity());
@@ -140,11 +141,13 @@
Set<String> categories = new HashSet<>();
categories.add("cat1");
categories.add("cat2");
+ int rank = 3;
ShortcutInfoCompat compat = mBuilder
.setActivity(activity)
.setCategories(categories)
.setDisabledMessage(disabledMessage)
.setLongLabel(longLabel)
+ .setRank(rank)
.build();
ShortcutInfoCompat copyCompat = new ShortcutInfoCompat.Builder(compat).build();
@@ -155,6 +158,7 @@
assertEquals(disabledMessage, copyCompat.getDisabledMessage());
assertEquals(activity, copyCompat.getActivity());
assertEquals(categories, copyCompat.getCategories());
+ assertEquals(rank, copyCompat.getRank());
}
@Test
@@ -166,7 +170,7 @@
Set<String> categories = new HashSet<>();
categories.add("cat1");
categories.add("cat2");
-
+ int rank = 3;
ShortcutInfo.Builder builder = new ShortcutInfo.Builder(mContext, TEST_SHORTCUT_ID);
ShortcutInfo shortcut = builder.setIntent(mAction)
.setShortLabel(TEST_SHORTCUT_SHORT_LABEL)
@@ -174,6 +178,7 @@
.setCategories(categories)
.setDisabledMessage(disabledMessage)
.setLongLabel(longLabel)
+ .setRank(rank)
.build();
ShortcutInfoCompat compat = new ShortcutInfoCompat.Builder(mContext, shortcut).build();
@@ -185,6 +190,7 @@
assertEquals(disabledMessage, compat.getDisabledMessage());
assertEquals(activity, compat.getActivity());
assertEquals(categories, compat.getCategories());
+ assertEquals(rank, compat.getRank());
}
@Test
@@ -195,12 +201,13 @@
Set<String> categories = new HashSet<>();
categories.add("cat1");
categories.add("cat2");
-
+ int rank = 3;
ShortcutInfoCompat compat = mBuilder
.setActivity(activity)
.setCategories(categories)
.setDisabledMessage(disabledMessage)
.setLongLabel(longLabel)
+ .setRank(3)
.build();
assertEquals(TEST_SHORTCUT_ID, compat.getId());
assertEquals(TEST_SHORTCUT_SHORT_LABEL, compat.getShortLabel());
@@ -209,6 +216,7 @@
assertEquals(disabledMessage, compat.getDisabledMessage());
assertEquals(activity, compat.getActivity());
assertEquals(categories, compat.getCategories());
+ assertEquals(rank, compat.getRank());
}
@Test
@@ -220,12 +228,13 @@
Set<String> categories = new HashSet<>();
categories.add("cat1");
categories.add("cat2");
-
+ int rank = 3;
ShortcutInfoCompat compat = mBuilder
.setActivity(activity)
.setCategories(categories)
.setDisabledMessage(disabledMessage)
.setLongLabel(longLabel)
+ .setRank(3)
.build();
ShortcutInfo shortcut = compat.toShortcutInfo();
@@ -238,6 +247,7 @@
assertEquals(disabledMessage, shortcut.getDisabledMessage());
assertEquals(activity, shortcut.getActivity());
assertEquals(categories, shortcut.getCategories());
+ assertEquals(rank, shortcut.getRank());
}
@Test
@@ -249,7 +259,7 @@
ShortcutInfoCompat compat = mBuilder
.setPersons(persons)
- .setLongLived()
+ .setLongLived(true)
.build();
ShortcutInfo shortcut = compat.toShortcutInfo();
diff --git a/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java b/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
index e5f4ef9..a8a8963 100644
--- a/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
@@ -67,6 +67,8 @@
// TODO: Support |auto| when the value of mIsLongLived is not set
boolean mIsLongLived;
+ int mRank;
+
ShortcutInfoCompat() { }
/**
@@ -92,6 +94,7 @@
if (mCategories != null) {
builder.setCategories(mCategories);
}
+ builder.setRank(mRank);
if (Build.VERSION.SDK_INT >= 29) {
if (mPersons != null && mPersons.length > 0) {
@@ -241,6 +244,15 @@
}
/**
+ * Returns the rank of the shortcut set with {@link Builder#setRank(int)}.
+ *
+ * @see Builder#setRank(int)
+ */
+ public int getRank() {
+ return mRank;
+ }
+
+ /**
* @hide
*/
@RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -311,6 +323,7 @@
mInfo.mIcon = shortcutInfo.mIcon;
mInfo.mIsAlwaysBadged = shortcutInfo.mIsAlwaysBadged;
mInfo.mIsLongLived = shortcutInfo.mIsLongLived;
+ mInfo.mRank = shortcutInfo.mRank;
if (shortcutInfo.mPersons != null) {
mInfo.mPersons = Arrays.copyOf(shortcutInfo.mPersons, shortcutInfo.mPersons.length);
}
@@ -336,6 +349,7 @@
mInfo.mDisabledMessage = shortcutInfo.getDisabledMessage();
mInfo.mCategories = shortcutInfo.getCategories();
mInfo.mPersons = ShortcutInfoCompat.getPersonsFromExtra(shortcutInfo.getExtras());
+ mInfo.mRank = shortcutInfo.getRank();
}
/**
@@ -480,13 +494,35 @@
}
/**
+ * @deprecated Use {@ink #setLongLived(boolean)) instead.
+ */
+ @Deprecated
+ @NonNull
+ public Builder setLongLived() {
+ mInfo.mIsLongLived = true;
+ return this;
+ }
+
+ /**
* Sets if a shortcut would be valid even if it has been unpublished/invisible by the app
* (as a dynamic or pinned shortcut). If it is long lived, it can be cached by various
* system services even after it has been unpublished as a dynamic shortcut.
*/
@NonNull
- public Builder setLongLived() {
- mInfo.mIsLongLived = true;
+ public Builder setLongLived(boolean longLived) {
+ mInfo.mIsLongLived = longLived;
+ return this;
+ }
+
+ /**
+ * Sets rank of a shortcut, which is a non-negative value that's used by the system to sort
+ * shortcuts. Lower value means higher importance.
+ *
+ * @see ShortcutInfo#getRank() for details.
+ */
+ @NonNull
+ public Builder setRank(int rank) {
+ mInfo.mRank = rank;
return this;
}
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index fe7bd58..6ad3e31 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -9,7 +9,7 @@
}
dependencies {
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 0b811cb..4e13514 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -22,7 +22,7 @@
// treats this as local jar and package it inside the aar.
api files(configurations.repackage)
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation(project(':collection:collection'))
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/fragment/fragment-ktx/build.gradle b/fragment/fragment-ktx/build.gradle
index 45b7557..7a021ff 100644
--- a/fragment/fragment-ktx/build.gradle
+++ b/fragment/fragment-ktx/build.gradle
@@ -38,7 +38,7 @@
api(project(":activity:activity-ktx")) {
because 'Mirror fragment dependency graph for -ktx artifacts'
}
- api("androidx.core:core-ktx:1.1.0-rc01") {
+ api("androidx.core:core-ktx:1.1.0") {
because 'Mirror fragment dependency graph for -ktx artifacts'
}
api("androidx.collection:collection-ktx:1.1.0") {
diff --git a/fragment/fragment/build.gradle b/fragment/fragment/build.gradle
index 669429a..777cb59 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -18,7 +18,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
api("androidx.collection:collection:1.1.0")
api("androidx.viewpager:viewpager:1.0.0")
api("androidx.loader:loader:1.0.0")
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index a3e453a..f5e1ba4 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -10,7 +10,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/gridlayout/build.gradle b/gridlayout/build.gradle
index efb7375..58ab795 100644
--- a/gridlayout/build.gradle
+++ b/gridlayout/build.gradle
@@ -10,7 +10,7 @@
dependencies {
api(ANDROIDX_ANNOTATION)
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/inspection/inspection/src/main/java/androidx/inspection/Connection.java b/inspection/inspection/src/main/java/androidx/inspection/Connection.java
new file mode 100644
index 0000000..fd0c3f2
--- /dev/null
+++ b/inspection/inspection/src/main/java/androidx/inspection/Connection.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.inspection;
+
+import androidx.annotation.NonNull;
+
+/**
+ * A class representing a connection between studio and inspectors.
+ */
+public abstract class Connection {
+
+ /**
+ * Sends raw bytes to studio.
+ *
+ * @param data An array of bytes. Up to inspectors to determine how to encode bytes.
+ */
+ public void sendEvent(@NonNull byte[] data) {
+ }
+}
diff --git a/inspection/inspection/src/main/java/androidx/inspection/Inspector.java b/inspection/inspection/src/main/java/androidx/inspection/Inspector.java
index c7686ad7..d5b68fc 100644
--- a/inspection/inspection/src/main/java/androidx/inspection/Inspector.java
+++ b/inspection/inspection/src/main/java/androidx/inspection/Inspector.java
@@ -16,16 +16,29 @@
package androidx.inspection;
+import androidx.annotation.NonNull;
+
/**
- * Implementation of this class are responsible to handle command from frontend and
- * send back events.
+ * Implementation of this class are responsible to handle command from frontend and
+ * send back events.
*/
public abstract class Inspector {
+
+ public Inspector(@NonNull Connection connection) {
+ }
+
/**
- * Called when this inspector was disposed and no longer needed.
- * <p>
+ * Called when this inspector is no longer needed.
+ *
* Agent should use this callback to unsubscribe from any events that it is listening to.
*/
public void onDispose() {
}
+
+ /**
+ * An inspector can implement this to handle incoming commands.
+ *
+ * @param data a raw byte array of the command sent by studio.
+ */
+ public abstract void onReceiveCommand(@NonNull byte[] data);
}
diff --git a/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java b/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java
index f0e3568..082f223 100644
--- a/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java
+++ b/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java
@@ -47,10 +47,12 @@
return mInspectorId;
}
- // TODO: pass the connection in this method
/**
+ * Creates a new inspector with the provided connection.
+ *
+ * @param connection a connection to send events.
* @return a new instance of an inspector.
*/
@NonNull
- public abstract T createInspector();
+ public abstract T createInspector(@NonNull Connection connection);
}
diff --git a/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt b/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt
index a19ad5b..b519102 100644
--- a/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt
+++ b/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt
@@ -26,7 +26,11 @@
@Test
fun dummyTest() {
- val value = object : Inspector() {}
+ val connection = object : Connection() {}
+ val value = object : Inspector(connection) {
+ override fun onReceiveCommand(data: ByteArray) {
+ }
+ }
assertThat(value).isNotNull()
}
}
\ No newline at end of file
diff --git a/leanback/build.gradle b/leanback/build.gradle
index 7588656..df32fcf 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -11,7 +11,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
api("androidx.interpolator:interpolator:1.0.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
api("androidx.media:media:1.0.0")
api("androidx.fragment:fragment:1.0.0")
diff --git a/legacy/core-utils/build.gradle b/legacy/core-utils/build.gradle
index 7a331a9..c4fed24 100644
--- a/legacy/core-utils/build.gradle
+++ b/legacy/core-utils/build.gradle
@@ -9,7 +9,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
api(project(":documentfile"))
api(project(":loader:loader"))
api(project(":localbroadcastmanager"))
diff --git a/media/build.gradle b/media/build.gradle
index 913a501..facba79 100644
--- a/media/build.gradle
+++ b/media/build.gradle
@@ -9,7 +9,7 @@
}
dependencies {
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/media2/integration-tests/testapp/build.gradle b/media2/integration-tests/testapp/build.gradle
index b269e6a..ffefd37 100644
--- a/media2/integration-tests/testapp/build.gradle
+++ b/media2/integration-tests/testapp/build.gradle
@@ -30,7 +30,7 @@
implementation(project(":media2:media2-player"))
implementation(project(":media2:media2-widget"))
implementation("androidx.appcompat:appcompat:1.0.2")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
}
android {
diff --git a/media2/session/api/1.1.0-alpha01.ignore b/media2/session/api/1.1.0-alpha01.ignore
new file mode 100644
index 0000000..a5f5b4a
--- /dev/null
+++ b/media2/session/api/1.1.0-alpha01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedInterface: androidx.media2.session.SessionResult:
+ Class androidx.media2.session.SessionResult no longer implements androidx.versionedparcelable.VersionedParcelable
diff --git a/media2/session/api/1.1.0-alpha01.txt b/media2/session/api/1.1.0-alpha01.txt
index d16e2fb..83a9ba0 100644
--- a/media2/session/api/1.1.0-alpha01.txt
+++ b/media2/session/api/1.1.0-alpha01.txt
@@ -353,7 +353,7 @@
method public androidx.media2.session.SessionCommandGroup.Builder removeCommand(androidx.media2.session.SessionCommand);
}
- public class SessionResult implements androidx.media2.common.BaseResult androidx.versionedparcelable.VersionedParcelable {
+ public class SessionResult extends androidx.versionedparcelable.CustomVersionedParcelable implements androidx.media2.common.BaseResult {
ctor public SessionResult(int, android.os.Bundle?);
method public long getCompletionTime();
method public android.os.Bundle? getCustomCommandResult();
diff --git a/media2/session/api/current.txt b/media2/session/api/current.txt
index d16e2fb..83a9ba0 100644
--- a/media2/session/api/current.txt
+++ b/media2/session/api/current.txt
@@ -353,7 +353,7 @@
method public androidx.media2.session.SessionCommandGroup.Builder removeCommand(androidx.media2.session.SessionCommand);
}
- public class SessionResult implements androidx.media2.common.BaseResult androidx.versionedparcelable.VersionedParcelable {
+ public class SessionResult extends androidx.versionedparcelable.CustomVersionedParcelable implements androidx.media2.common.BaseResult {
ctor public SessionResult(int, android.os.Bundle?);
method public long getCompletionTime();
method public android.os.Bundle? getCustomCommandResult();
diff --git a/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java b/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java
index 2982d35..e22bbe6 100644
--- a/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java
@@ -54,8 +54,10 @@
PendingIntent mSessionActivity;
@ParcelField(3)
int mPlayerState;
- @ParcelField(4)
+ @NonParcelField
MediaItem mCurrentMediaItem;
+ @ParcelField(4)
+ MediaItem mParcelableCurrentMediaItem;
@ParcelField(5)
long mPositionEventTimeMs;
@ParcelField(6)
@@ -235,11 +237,14 @@
@Override
public void onPreParceling(boolean isStream) {
mSessionBinder = (IBinder) mSessionStub;
+ mParcelableCurrentMediaItem = MediaUtils.upcastForPreparceling(mCurrentMediaItem);
}
@Override
public void onPostParceling() {
mSessionStub = IMediaSession.Stub.asInterface(mSessionBinder);
mSessionBinder = null;
+ mCurrentMediaItem = mParcelableCurrentMediaItem;
+ mParcelableCurrentMediaItem = null;
}
}
diff --git a/media2/session/src/main/java/androidx/media2/session/LibraryResult.java b/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
index c1dd2d4..def0bc2 100644
--- a/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
@@ -72,8 +72,10 @@
int mResultCode;
@ParcelField(2)
long mCompletionTime;
- @ParcelField(3)
+ @NonParcelField
MediaItem mItem;
+ @ParcelField(3)
+ MediaItem mParcelableItem;
@ParcelField(4)
MediaLibraryService.LibraryParams mParams;
// Mark list of media items NonParcelField to send the list through the ParcelImpListSlice.
@@ -221,6 +223,7 @@
@RestrictTo(LIBRARY)
@Override
public void onPreParceling(boolean isStream) {
+ mParcelableItem = MediaUtils.upcastForPreparceling(mItem);
mItemListSlice = MediaUtils.convertMediaItemListToParcelImplListSlice(mItemList);
}
@@ -230,6 +233,8 @@
@RestrictTo(LIBRARY)
@Override
public void onPostParceling() {
+ mItem = mParcelableItem;
+ mParcelableItem = null;
mItemList = MediaUtils.convertParcelImplListSliceToMediaItemList(mItemListSlice);
mItemListSlice = null;
}
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaUtils.java b/media2/session/src/main/java/androidx/media2/session/MediaUtils.java
index 1b2b775..f9148f3 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaUtils.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaUtils.java
@@ -130,6 +130,24 @@
}
/**
+ * Upcasts a {@link MediaItem} to the {@link MediaItem} type for pre-parceling. Note that
+ * {@link MediaItem}'s subclass object cannot be parceled due to the security issue.
+ *
+ * @param item an item
+ * @return
+ */
+ // TODO(b/139255697): Provide the functionality in the media2-common.
+ public static MediaItem upcastForPreparceling(MediaItem item) {
+ if (item == null || item.getClass() == MediaItem.class) {
+ return item;
+ }
+ return new MediaItem.Builder()
+ .setStartPosition(item.getStartPosition())
+ .setEndPosition(item.getEndPosition())
+ .setMetadata(item.getMetadata()).build();
+ }
+
+ /**
* Creates a {@link MediaBrowserCompat.MediaItem} from the {@link MediaItem}.
*
* @param item2 an item.
@@ -805,7 +823,7 @@
*/
@NonNull
public static SessionCommandGroup convertToSessionCommandGroup(long sessionFlags,
- PlaybackStateCompat state) {
+ @Nullable PlaybackStateCompat state) {
SessionCommandGroup.Builder commandsBuilder = new SessionCommandGroup.Builder();
commandsBuilder.addAllPlayerBasicCommands(COMMAND_VERSION_CURRENT);
boolean includePlaylistCommands = (sessionFlags & FLAG_HANDLES_QUEUE_COMMANDS) != 0;
@@ -836,7 +854,7 @@
* @return custom layout. Always non-null.
*/
@NonNull
- public static List<CommandButton> convertToCustomLayout(PlaybackStateCompat state) {
+ public static List<CommandButton> convertToCustomLayout(@Nullable PlaybackStateCompat state) {
List<CommandButton> layout = new ArrayList<>();
if (state == null) {
return layout;
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionResult.java b/media2/session/src/main/java/androidx/media2/session/SessionResult.java
index e9a8301..998b4c0 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionResult.java
@@ -16,6 +16,7 @@
package androidx.media2.session;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.os.Bundle;
@@ -29,8 +30,9 @@
import androidx.concurrent.futures.ResolvableFuture;
import androidx.media2.common.MediaItem;
import androidx.media2.common.SessionPlayer;
+import androidx.versionedparcelable.CustomVersionedParcelable;
+import androidx.versionedparcelable.NonParcelField;
import androidx.versionedparcelable.ParcelField;
-import androidx.versionedparcelable.VersionedParcelable;
import androidx.versionedparcelable.VersionedParcelize;
import com.google.common.util.concurrent.ListenableFuture;
@@ -43,7 +45,7 @@
* {@link MediaSession} and {@link MediaController}.
*/
@VersionedParcelize
-public class SessionResult implements RemoteResult, VersionedParcelable {
+public class SessionResult extends CustomVersionedParcelable implements RemoteResult {
/**
* Result code representing that the command is successfully completed.
* <p>
@@ -84,8 +86,10 @@
long mCompletionTime;
@ParcelField(3)
Bundle mCustomCommandResult;
- @ParcelField(4)
+ @NonParcelField
MediaItem mItem;
+ @ParcelField(4)
+ MediaItem mParcelableItem;
/**
* Constructor to be used by {@link MediaSession.SessionCallback#onCustomCommand(
@@ -208,4 +212,23 @@
public MediaItem getMediaItem() {
return mItem;
}
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY)
+ @Override
+ public void onPreParceling(boolean isStream) {
+ mParcelableItem = MediaUtils.upcastForPreparceling(mItem);
+ }
+
+ /**
+ * @hide
+ */
+ @RestrictTo(LIBRARY)
+ @Override
+ public void onPostParceling() {
+ mItem = mParcelableItem;
+ mParcelableItem = null;
+ }
}
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java
index accb8aa..69e1734 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java
@@ -226,12 +226,10 @@
ParcelImplListSlice listSlice = config.getParcelable(KEY_PLAYLIST);
if (listSlice != null) {
- localPlayer.mPlaylist = MediaTestUtils.convertToMediaItems(listSlice.getList(),
- false /* createItem */);
+ localPlayer.mPlaylist = MediaTestUtils.convertToMediaItems(listSlice.getList());
}
- ParcelImpl currentItem = config.getParcelable(KEY_MEDIA_ITEM);
- localPlayer.mCurrentMediaItem = (currentItem == null)
- ? null : (MediaItem) MediaParcelUtils.fromParcelable(currentItem);
+ localPlayer.mCurrentMediaItem =
+ MediaTestUtils.convertToMediaItem(config.getParcelable(KEY_MEDIA_ITEM));
localPlayer.mMetadata = ParcelUtils.getVersionedParcelable(config, KEY_METADATA);
ParcelImpl videoSize = config.getParcelable(KEY_VIDEO_SIZE);
if (videoSize != null) {
@@ -439,7 +437,7 @@
throws RemoteException {
MediaSession session = mSessionMap.get(sessionId);
MockPlayer player = (MockPlayer) session.getPlayer();
- player.mPlaylist = MediaTestUtils.convertToMediaItems(playlist, false /* createItem */);
+ player.mPlaylist = MediaTestUtils.convertToMediaItems(playlist);
}
@Override
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java
index e1a375d..7e3fa85 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.util.Log;
@@ -30,6 +31,7 @@
import androidx.media2.common.MediaItem;
import androidx.media2.common.MediaMetadata;
import androidx.media2.common.MediaParcelUtils;
+import androidx.media2.common.UriMediaItem;
import androidx.media2.session.MediaLibraryService.LibraryParams;
import androidx.media2.session.MediaSession;
import androidx.media2.session.MediaSession.ControllerInfo;
@@ -133,28 +135,54 @@
.build();
}
- public static List<MediaItem> convertToMediaItems(List<ParcelImpl> list,
- boolean createItem) {
+ /**
+ * Converts the List of {@link ParcelImpl} to the list of {@link MediaItem} with the
+ * {@link #convertToMediaItem(ParcelImpl)}.
+ * <p>
+ * Use this API in the {@link MediaSessionProviderService} to handle incoming initialization
+ * requests from the RemoteMediaSession. It would help to test {@link MediaItem}'s subclass
+ * instance across the process.
+ *
+ * @param list
+ * @return
+ */
+ public static List<MediaItem> convertToMediaItems(List<ParcelImpl> list) {
if (list == null) {
return null;
}
List<MediaItem> result = new ArrayList<>();
- if (createItem) {
- for (ParcelImpl parcel : list) {
- MediaItem item = MediaParcelUtils.fromParcelable(parcel);
- result.add(new FileMediaItem.Builder(ParcelFileDescriptor.adoptFd(-1))
- .setMetadata(item.getMetadata())
- .build());
- }
- } else {
- for (ParcelImpl parcel : list) {
- result.add((MediaItem) MediaParcelUtils.fromParcelable(parcel));
- }
+ for (ParcelImpl parcel : list) {
+ result.add(convertToMediaItem(parcel));
}
return result;
}
+ /**
+ * Converts the {@link ParcelImpl} to {@link MediaItem}, by creating {@link UriMediaItem}.
+ * <p>
+ * Use this API in the {@link MediaSessionProviderService} to handle incoming initialization
+ * requests from the RemoteMediaSession. It would help to test {@link MediaItem}'s subclass
+ * instance across the process.
+ *
+ * @param item
+ * @return
+ */
+ public static MediaItem convertToMediaItem(ParcelImpl item) {
+ if (item == null) {
+ return null;
+ }
+ MediaItem mediaItem = MediaParcelUtils.fromParcelable(item);
+ if (mediaItem == null) {
+ return null;
+ }
+ String mediaId = mediaItem.getMediaId();
+ return new UriMediaItem.Builder(Uri.parse("android://" + mediaId))
+ .setStartPosition(mediaItem.getStartPosition())
+ .setEndPosition(mediaItem.getEndPosition())
+ .setMetadata(mediaItem.getMetadata()).build();
+ }
+
public static ControllerInfo getTestControllerInfo(MediaSession session) {
if (session == null) {
return null;
diff --git a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java
index 2c3e2bf..3df4b6d 100644
--- a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java
+++ b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java
@@ -23,6 +23,7 @@
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@@ -301,29 +302,31 @@
assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
assertEquals(0, playerWrapper.getCurrentMediaItemIndex());
- onView(allOf(withId(R.id.prev), not(isClickable())));
- onView(allOf(withId(R.id.next), isClickable()));
+ onView(allOf(withId(R.id.prev), isCompletelyDisplayed()))
+ .check(matches(not(isEnabled())));
+ onView(allOf(withId(R.id.next), isCompletelyDisplayed())).check(matches(isEnabled()));
callback.mItemLatch = new CountDownLatch(1);
onView(allOf(withId(R.id.next), isCompletelyDisplayed())).perform(click());
assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
assertEquals(1, playerWrapper.getCurrentMediaItemIndex());
- onView(allOf(withId(R.id.prev), isClickable()));
- onView(allOf(withId(R.id.next), isClickable()));
+ onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).check(matches(isEnabled()));
+ onView(allOf(withId(R.id.next), isCompletelyDisplayed())).check(matches(isEnabled()));
callback.mItemLatch = new CountDownLatch(1);
onView(allOf(withId(R.id.next), isCompletelyDisplayed())).perform(click());
assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
assertEquals(2, playerWrapper.getCurrentMediaItemIndex());
- onView(allOf(withId(R.id.prev), isClickable()));
- onView(allOf(withId(R.id.next), not(isClickable())));
+ onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).check(matches(isEnabled()));
+ onView(allOf(withId(R.id.next), isCompletelyDisplayed()))
+ .check(matches(not(isEnabled())));
callback.mItemLatch = new CountDownLatch(1);
onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).perform(click());
assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
assertEquals(1, playerWrapper.getCurrentMediaItemIndex());
- onView(allOf(withId(R.id.prev), isClickable()));
- onView(allOf(withId(R.id.next), isClickable()));
+ onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).check(matches(isEnabled()));
+ onView(allOf(withId(R.id.next), isCompletelyDisplayed())).check(matches(isEnabled()));
}
@Test
diff --git a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
index e005a01..19b36f11 100644
--- a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
+++ b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
@@ -141,6 +141,8 @@
return list;
}
+ // TODO(b/138091975) Do not ignore returned Futures if feasible.
+ @SuppressWarnings("FutureReturnValueIgnored")
PlayerWrapper createPlayerWrapperOfController(@NonNull PlayerWrapper.PlayerCallback callback,
@Nullable MediaItem item, @Nullable List<MediaItem> playlist) {
prepareLooper();
@@ -169,6 +171,8 @@
return wrapper;
}
+ // TODO(b/138091975) Do not ignore returned Futures if feasible.
+ @SuppressWarnings("FutureReturnValueIgnored")
PlayerWrapper createPlayerWrapperOfPlayer(@NonNull PlayerWrapper.PlayerCallback callback,
@Nullable MediaItem item, @Nullable List<MediaItem> playlist) {
SessionPlayer player = new MediaPlayer(mContext);
diff --git a/media2/widget/src/androidTest/res/values/themes.xml b/media2/widget/src/androidTest/res/values/themes.xml
index 2843f5e..ff1c3ab 100644
--- a/media2/widget/src/androidTest/res/values/themes.xml
+++ b/media2/widget/src/androidTest/res/values/themes.xml
@@ -18,7 +18,7 @@
<resources>
<style name="HasWindowTitle">
- <item name="windowNoTitle">false</item>
+ <item name="android:windowNoTitle">false</item>
</style>
</resources>
\ No newline at end of file
diff --git a/paging/common/api/3.0.0-alpha01.txt b/paging/common/api/3.0.0-alpha01.txt
index ffefbad..ac81ae2 100644
--- a/paging/common/api/3.0.0-alpha01.txt
+++ b/paging/common/api/3.0.0-alpha01.txt
@@ -135,9 +135,15 @@
ctor public PageKeyedDataSourceKt();
}
+ public enum PageLoadType {
+ enum_constant public static final androidx.paging.PageLoadType END;
+ enum_constant public static final androidx.paging.PageLoadType REFRESH;
+ enum_constant public static final androidx.paging.PageLoadType START;
+ }
+
public abstract class PagedList<T> extends java.util.AbstractList<T> {
method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
- method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public abstract void detach();
method public T? get(int index);
method public androidx.paging.PagedList.Config getConfig();
@@ -151,7 +157,7 @@
method public boolean isImmutable();
method public void loadAround(int index);
method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
- method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void retry();
method public java.util.List<T> snapshot();
property public androidx.paging.PagedList.Config config;
@@ -238,12 +244,6 @@
field public static final androidx.paging.PagedList.LoadState.Loading! INSTANCE;
}
- public enum PagedList.LoadType {
- enum_constant public static final androidx.paging.PagedList.LoadType END;
- enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
- enum_constant public static final androidx.paging.PagedList.LoadType START;
- }
-
public final class PagedListConfigKt {
ctor public PagedListConfigKt();
method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -284,16 +284,16 @@
}
public static final class PagedSource.LoadParams<Key> {
- ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
- method public androidx.paging.PagedSource.LoadType component1();
+ ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PageLoadType component1();
method public Key? component2();
method public int component3();
method public boolean component4();
method public int component5();
- method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
method public Key? getKey();
method public int getLoadSize();
- method public androidx.paging.PagedSource.LoadType getLoadType();
+ method public androidx.paging.PageLoadType getLoadType();
method public int getPageSize();
method public boolean getPlaceholdersEnabled();
}
@@ -318,12 +318,6 @@
public static final class PagedSource.LoadResult.Companion {
}
- public enum PagedSource.LoadType {
- enum_constant public static final androidx.paging.PagedSource.LoadType END;
- enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
- enum_constant public static final androidx.paging.PagedSource.LoadType START;
- }
-
public final class PagedSourceKt {
ctor public PagedSourceKt();
}
diff --git a/paging/common/api/current.txt b/paging/common/api/current.txt
index ffefbad..ac81ae2 100644
--- a/paging/common/api/current.txt
+++ b/paging/common/api/current.txt
@@ -135,9 +135,15 @@
ctor public PageKeyedDataSourceKt();
}
+ public enum PageLoadType {
+ enum_constant public static final androidx.paging.PageLoadType END;
+ enum_constant public static final androidx.paging.PageLoadType REFRESH;
+ enum_constant public static final androidx.paging.PageLoadType START;
+ }
+
public abstract class PagedList<T> extends java.util.AbstractList<T> {
method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
- method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public abstract void detach();
method public T? get(int index);
method public androidx.paging.PagedList.Config getConfig();
@@ -151,7 +157,7 @@
method public boolean isImmutable();
method public void loadAround(int index);
method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
- method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void retry();
method public java.util.List<T> snapshot();
property public androidx.paging.PagedList.Config config;
@@ -238,12 +244,6 @@
field public static final androidx.paging.PagedList.LoadState.Loading! INSTANCE;
}
- public enum PagedList.LoadType {
- enum_constant public static final androidx.paging.PagedList.LoadType END;
- enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
- enum_constant public static final androidx.paging.PagedList.LoadType START;
- }
-
public final class PagedListConfigKt {
ctor public PagedListConfigKt();
method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -284,16 +284,16 @@
}
public static final class PagedSource.LoadParams<Key> {
- ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
- method public androidx.paging.PagedSource.LoadType component1();
+ ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PageLoadType component1();
method public Key? component2();
method public int component3();
method public boolean component4();
method public int component5();
- method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
method public Key? getKey();
method public int getLoadSize();
- method public androidx.paging.PagedSource.LoadType getLoadType();
+ method public androidx.paging.PageLoadType getLoadType();
method public int getPageSize();
method public boolean getPlaceholdersEnabled();
}
@@ -318,12 +318,6 @@
public static final class PagedSource.LoadResult.Companion {
}
- public enum PagedSource.LoadType {
- enum_constant public static final androidx.paging.PagedSource.LoadType END;
- enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
- enum_constant public static final androidx.paging.PagedSource.LoadType START;
- }
-
public final class PagedSourceKt {
ctor public PagedSourceKt();
}
diff --git a/paging/common/api/restricted_3.0.0-alpha01.txt b/paging/common/api/restricted_3.0.0-alpha01.txt
index 939db30..259dc82 100644
--- a/paging/common/api/restricted_3.0.0-alpha01.txt
+++ b/paging/common/api/restricted_3.0.0-alpha01.txt
@@ -44,7 +44,6 @@
method @AnyThread public void onInvalidated();
}
-
public static final class DataSource.Params<K> {
method public int getInitialLoadSize();
method public K? getKey();
@@ -139,10 +138,16 @@
ctor public PageKeyedDataSourceKt();
}
+ public enum PageLoadType {
+ enum_constant public static final androidx.paging.PageLoadType END;
+ enum_constant public static final androidx.paging.PageLoadType REFRESH;
+ enum_constant public static final androidx.paging.PageLoadType START;
+ }
+
public abstract class PagedList<T> extends java.util.AbstractList<T> {
ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public PagedList(kotlinx.coroutines.CoroutineScope coroutineScope, androidx.paging.PagedSource<?,T> pagedSource, androidx.paging.PagedStorage<T> storage, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher backgroundDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? boundaryCallback, androidx.paging.PagedList.Config config);
method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
- method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final suspend <K, T> Object create(androidx.paging.PagedSource<K,T> p, kotlinx.coroutines.CoroutineScope pagedSource, kotlinx.coroutines.CoroutineDispatcher coroutineScope, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? initialFetchDispatcher, androidx.paging.PagedList.Config boundaryCallback, K? config, kotlin.coroutines.Continuation<? super androidx.paging.PagedList<T>> key);
method public abstract void detach();
method public T? get(int index);
@@ -158,9 +163,9 @@
method public boolean isImmutable();
method public void loadAround(int index);
method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
- method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void retry();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PagedList.LoadType loadType, androidx.paging.PagedList.LoadState loadState);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PageLoadType loadType, androidx.paging.PagedList.LoadState loadState);
method public java.util.List<T> snapshot();
property public androidx.paging.PagedList.Config config;
property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
@@ -251,26 +256,20 @@
}
@RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class PagedList.LoadStateManager {
- method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public final androidx.paging.PagedList.LoadState getEndState();
method public final androidx.paging.PagedList.LoadState getRefreshState();
method public final androidx.paging.PagedList.LoadState getStartState();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
method public final void setEndState(androidx.paging.PagedList.LoadState p);
method public final void setRefreshState(androidx.paging.PagedList.LoadState p);
method public final void setStartState(androidx.paging.PagedList.LoadState p);
- method public final void setState(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+ method public final void setState(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
property public final androidx.paging.PagedList.LoadState endState;
property public final androidx.paging.PagedList.LoadState refreshState;
property public final androidx.paging.PagedList.LoadState startState;
}
- public enum PagedList.LoadType {
- enum_constant public static final androidx.paging.PagedList.LoadType END;
- enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
- enum_constant public static final androidx.paging.PagedList.LoadType START;
- }
-
public final class PagedListConfigKt {
ctor public PagedListConfigKt();
method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -311,16 +310,16 @@
}
public static final class PagedSource.LoadParams<Key> {
- ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
- method public androidx.paging.PagedSource.LoadType component1();
+ ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PageLoadType component1();
method public Key? component2();
method public int component3();
method public boolean component4();
method public int component5();
- method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
method public Key? getKey();
method public int getLoadSize();
- method public androidx.paging.PagedSource.LoadType getLoadType();
+ method public androidx.paging.PageLoadType getLoadType();
method public int getPageSize();
method public boolean getPlaceholdersEnabled();
}
@@ -345,12 +344,6 @@
public static final class PagedSource.LoadResult.Companion {
}
- public enum PagedSource.LoadType {
- enum_constant public static final androidx.paging.PagedSource.LoadType END;
- enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
- enum_constant public static final androidx.paging.PagedSource.LoadType START;
- }
-
public final class PagedSourceKt {
ctor public PagedSourceKt();
}
diff --git a/paging/common/api/restricted_current.txt b/paging/common/api/restricted_current.txt
index 939db30..259dc82 100644
--- a/paging/common/api/restricted_current.txt
+++ b/paging/common/api/restricted_current.txt
@@ -44,7 +44,6 @@
method @AnyThread public void onInvalidated();
}
-
public static final class DataSource.Params<K> {
method public int getInitialLoadSize();
method public K? getKey();
@@ -139,10 +138,16 @@
ctor public PageKeyedDataSourceKt();
}
+ public enum PageLoadType {
+ enum_constant public static final androidx.paging.PageLoadType END;
+ enum_constant public static final androidx.paging.PageLoadType REFRESH;
+ enum_constant public static final androidx.paging.PageLoadType START;
+ }
+
public abstract class PagedList<T> extends java.util.AbstractList<T> {
ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public PagedList(kotlinx.coroutines.CoroutineScope coroutineScope, androidx.paging.PagedSource<?,T> pagedSource, androidx.paging.PagedStorage<T> storage, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher backgroundDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? boundaryCallback, androidx.paging.PagedList.Config config);
method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
- method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final suspend <K, T> Object create(androidx.paging.PagedSource<K,T> p, kotlinx.coroutines.CoroutineScope pagedSource, kotlinx.coroutines.CoroutineDispatcher coroutineScope, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? initialFetchDispatcher, androidx.paging.PagedList.Config boundaryCallback, K? config, kotlin.coroutines.Continuation<? super androidx.paging.PagedList<T>> key);
method public abstract void detach();
method public T? get(int index);
@@ -158,9 +163,9 @@
method public boolean isImmutable();
method public void loadAround(int index);
method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
- method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void retry();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PagedList.LoadType loadType, androidx.paging.PagedList.LoadState loadState);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PageLoadType loadType, androidx.paging.PagedList.LoadState loadState);
method public java.util.List<T> snapshot();
property public androidx.paging.PagedList.Config config;
property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
@@ -251,26 +256,20 @@
}
@RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class PagedList.LoadStateManager {
- method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public final androidx.paging.PagedList.LoadState getEndState();
method public final androidx.paging.PagedList.LoadState getRefreshState();
method public final androidx.paging.PagedList.LoadState getStartState();
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
method public final void setEndState(androidx.paging.PagedList.LoadState p);
method public final void setRefreshState(androidx.paging.PagedList.LoadState p);
method public final void setStartState(androidx.paging.PagedList.LoadState p);
- method public final void setState(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+ method public final void setState(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
property public final androidx.paging.PagedList.LoadState endState;
property public final androidx.paging.PagedList.LoadState refreshState;
property public final androidx.paging.PagedList.LoadState startState;
}
- public enum PagedList.LoadType {
- enum_constant public static final androidx.paging.PagedList.LoadType END;
- enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
- enum_constant public static final androidx.paging.PagedList.LoadType START;
- }
-
public final class PagedListConfigKt {
ctor public PagedListConfigKt();
method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -311,16 +310,16 @@
}
public static final class PagedSource.LoadParams<Key> {
- ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
- method public androidx.paging.PagedSource.LoadType component1();
+ ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PageLoadType component1();
method public Key? component2();
method public int component3();
method public boolean component4();
method public int component5();
- method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+ method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
method public Key? getKey();
method public int getLoadSize();
- method public androidx.paging.PagedSource.LoadType getLoadType();
+ method public androidx.paging.PageLoadType getLoadType();
method public int getPageSize();
method public boolean getPlaceholdersEnabled();
}
@@ -345,12 +344,6 @@
public static final class PagedSource.LoadResult.Companion {
}
- public enum PagedSource.LoadType {
- enum_constant public static final androidx.paging.PagedSource.LoadType END;
- enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
- enum_constant public static final androidx.paging.PagedSource.LoadType START;
- }
-
public final class PagedSourceKt {
ctor public PagedSourceKt();
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
index 2fd1150..9ec9758 100644
--- a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
@@ -18,11 +18,11 @@
import androidx.annotation.MainThread
import androidx.annotation.RestrictTo
+import androidx.paging.PageLoadType.END
+import androidx.paging.PageLoadType.REFRESH
+import androidx.paging.PageLoadType.START
import androidx.paging.PagedList.LoadState.Idle
import androidx.paging.PagedList.LoadState.Loading
-import androidx.paging.PagedList.LoadType.END
-import androidx.paging.PagedList.LoadType.REFRESH
-import androidx.paging.PagedList.LoadType.START
import androidx.paging.PagedSource.KeyProvider
import androidx.paging.PagedSource.LoadResult.Companion.COUNT_UNDEFINED
import kotlinx.coroutines.CoroutineDispatcher
@@ -104,7 +104,10 @@
/**
* Given a page result, apply or drop it, and return whether more loading is needed.
*/
- override fun onPageResult(type: LoadType, pageResult: PagedSource.LoadResult<*, V>): Boolean {
+ override fun onPageResult(
+ type: PageLoadType,
+ pageResult: PagedSource.LoadResult<*, V>
+ ): Boolean {
var continueLoading = false
val page = pageResult.data
@@ -180,9 +183,10 @@
return continueLoading
}
- override fun onStateChanged(type: LoadType, state: LoadState) = dispatchStateChange(type, state)
+ override fun onStateChanged(type: PageLoadType, state: LoadState) =
+ dispatchStateChange(type, state)
- private fun triggerBoundaryCallback(type: LoadType, page: List<V>) {
+ private fun triggerBoundaryCallback(type: PageLoadType, page: List<V>) {
if (boundaryCallback != null) {
val deferEmpty = storage.size == 0
val deferBegin = (!deferEmpty && type == START && page.isEmpty())
@@ -240,7 +244,7 @@
pager.loadStateManager.dispatchCurrentLoadState(callback)
}
- override fun setInitialLoadState(loadType: LoadType, loadState: LoadState) {
+ override fun setInitialLoadState(loadType: PageLoadType, loadState: LoadState) {
pager.loadStateManager.setState(loadType, loadState)
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/DataSource.kt b/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
index 5e0e59e..3a90a7e 100644
--- a/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
@@ -431,21 +431,11 @@
}
/**
- * @hide
- */
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- enum class LoadType {
- INITIAL,
- START,
- END
- }
-
- /**
* @param K Type of the key used to query the [DataSource].
* @property key Can be `null` for init, otherwise non-null
*/
class Params<K : Any> internal constructor(
- internal val type: LoadType,
+ internal val type: PageLoadType,
val key: K?,
val initialLoadSize: Int,
val placeholdersEnabled: Boolean,
diff --git a/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt b/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt
index 7407055..a3628e8 100644
--- a/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt
@@ -23,7 +23,7 @@
/**
* InitialPagedList is an empty placeholder that's sent at the front of a stream of PagedLists.
*
- * It's used solely for listening to [PagedList.LoadType.REFRESH] loading events, and retrying
+ * It's used solely for listening to [PageLoadType.REFRESH] loading events, and retrying
* any errors that occur during initial load.
*
* @hide
diff --git a/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt b/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt
index 6066a0d..074c08a 100644
--- a/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt
@@ -181,15 +181,15 @@
@Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
internal final override suspend fun load(params: Params<Key>): BaseResult<Value> {
return when (params.type) {
- LoadType.INITIAL -> loadInitial(
+ PageLoadType.REFRESH -> loadInitial(
LoadInitialParams(
params.key,
params.initialLoadSize,
params.placeholdersEnabled
)
)
- LoadType.START -> loadBefore(LoadParams(params.key!!, params.pageSize))
- LoadType.END -> loadAfter(LoadParams(params.key!!, params.pageSize))
+ PageLoadType.START -> loadBefore(LoadParams(params.key!!, params.pageSize))
+ PageLoadType.END -> loadAfter(LoadParams(params.key!!, params.pageSize))
}
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt b/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt
index 25d5f3e..a62d597 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt
@@ -211,15 +211,15 @@
*/
@Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
internal final override suspend fun load(params: Params<Key>): BaseResult<Value> = when {
- params.type == LoadType.INITIAL -> loadInitial(
+ params.type == PageLoadType.REFRESH -> loadInitial(
LoadInitialParams(
params.initialLoadSize,
params.placeholdersEnabled
)
)
params.key == null -> BaseResult.empty()
- params.type == LoadType.START -> loadBefore(LoadParams(params.key, params.pageSize))
- params.type == LoadType.END -> loadAfter(LoadParams(params.key, params.pageSize))
+ params.type == PageLoadType.START -> loadBefore(LoadParams(params.key, params.pageSize))
+ params.type == PageLoadType.END -> loadAfter(LoadParams(params.key, params.pageSize))
else -> throw IllegalArgumentException("Unsupported type " + params.type.toString())
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/PageLoadType.kt b/paging/common/src/main/kotlin/androidx/paging/PageLoadType.kt
new file mode 100644
index 0000000..bd6ed01
--- /dev/null
+++ b/paging/common/src/main/kotlin/androidx/paging/PageLoadType.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.paging
+
+/**
+ * Type of load a [PagedList] can trigger a [PagedSource] to perform.
+ *
+ * You can use a [LoadStateListener] to observe [PagedList.LoadState] of any [PageLoadType]. For UI
+ * purposes (swipe refresh, loading spinner, retry button), this is typically done by registering a
+ * [LoadStateListener] with the [androidx.paging.PagedListAdapter] or
+ * [androidx.paging.AsyncPagedListDiffer].
+ *
+ * @see PagedList.LoadState
+ */
+enum class PageLoadType {
+ /**
+ * [PagedList] content being refreshed, which can also be a result of [PagedSource]
+ * invalidation, refresh that may contain content updates, or the initial load.
+ */
+ REFRESH,
+
+ /**
+ * Load at the start of the [PagedList].
+ */
+ START,
+
+ /**
+ * Load at the end of the [PagedList].
+ */
+ END
+}
\ No newline at end of file
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
index 6ec7f37..9d429b1 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
@@ -26,7 +26,6 @@
import androidx.paging.PagedList.Config.Builder
import androidx.paging.PagedList.Config.Companion.MAX_SIZE_UNBOUNDED
import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
import androidx.paging.PagedSource.KeyProvider
import androidx.paging.futures.DirectDispatcher
import kotlinx.coroutines.CoroutineDispatcher
@@ -46,7 +45,7 @@
* Callback for changes to loading state - whether the refresh, prepend, or append is idle, loading,
* or has an error.
*
- * Used to observe the [LoadState] of any [LoadType] (REFRESH/START/END). For UI purposes (swipe
+ * Used to observe the [LoadState] of any [PageLoadType] (REFRESH/START/END). For UI purposes (swipe
* refresh, loading spinner, retry button), this is typically done by registering a
* [LoadStateListener] with the [androidx.paging.PagedListAdapter] or
* [androidx.paging.AsyncPagedListDiffer].
@@ -61,10 +60,10 @@
* START/END events can be used to drive loading spinner items in your `RecyclerView`.
*
* @see [LoadState]
- * @see [LoadType]
+ * @see [PageLoadType]
* @see [PagedList.retry]
*/
-typealias LoadStateListener = (type: LoadType, state: LoadState) -> Unit
+typealias LoadStateListener = (type: PageLoadType, state: LoadState) -> Unit
/**
* Lazy loading list that pages in immutable content from a [PagedSource].
@@ -190,7 +189,7 @@
}
val params = PagedSource.LoadParams(
- PagedSource.LoadType.INITIAL,
+ PageLoadType.REFRESH,
key,
config.initialLoadSizeHint,
config.enablePlaceholders,
@@ -215,40 +214,13 @@
}
/**
- * Type of load a PagedList can perform.
+ * LoadState of a PagedList load - associated with a [PageLoadType]
*
- * You can use a [LoadStateListener] to observe [LoadState] of any [LoadType]. For UI purposes
- * (swipe refresh, loading spinner, retry button), this is typically done by registering a
- * [LoadStateListener] with the [androidx.paging.PagedListAdapter] or
- * [androidx.paging.AsyncPagedListDiffer].
- *
- * @see LoadState
- */
- enum class LoadType {
- /**
- * [PagedList] content being reloaded, may contain content updates.
- */
- REFRESH,
-
- /**
- * Load at the start of the [PagedList].
- */
- START,
-
- /**
- * Load at the end of the [PagedList].
- */
- END
- }
-
- /**
- * LoadState of a PagedList load - associated with a [LoadType]
- *
- * You can use a [LoadStateListener] to observe [LoadState] of any [LoadType]. For UI
+ * You can use a [LoadStateListener] to observe [LoadState] of any [PageLoadType]. For UI
* purposes (swipe refresh, loading spinner, retry button), this is typically done by
* registering a callback with the `PagedListAdapter` or `AsyncPagedListDiffer`.
*
- * @see LoadType
+ * @see PageLoadType
*/
sealed class LoadState {
/**
@@ -506,7 +478,7 @@
* Creates a [PagedList] asynchronously with the given parameters.
*
* This call will dispatch [PagedSource.load] immediately with
- * [PagedSource.LoadType.INITIAL], and return a [PagedList] once it completes, triggering
+ * [PageLoadType.REFRESH], and return a [PagedList] once it completes, triggering
* [loadStateListeners].
*
* @throws IllegalArgumentException if [notifyDispatcher] or [fetchDispatcher] are not set.
@@ -903,18 +875,18 @@
var startState: LoadState = LoadState.Idle
var endState: LoadState = LoadState.Idle
- fun setState(type: LoadType, state: LoadState) {
+ fun setState(type: PageLoadType, state: LoadState) {
// deduplicate signals
when (type) {
- LoadType.REFRESH -> {
+ PageLoadType.REFRESH -> {
if (refreshState == state) return
refreshState = state
}
- LoadType.START -> {
+ PageLoadType.START -> {
if (startState == state) return
startState = state
}
- LoadType.END -> {
+ PageLoadType.END -> {
if (endState == state) return
endState = state
}
@@ -927,12 +899,12 @@
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) // protected otherwise.
- abstract fun onStateChanged(type: LoadType, state: LoadState)
+ abstract fun onStateChanged(type: PageLoadType, state: LoadState)
fun dispatchCurrentLoadState(callback: LoadStateListener) {
- callback(LoadType.REFRESH, refreshState)
- callback(LoadType.START, startState)
- callback(LoadType.END, endState)
+ callback(PageLoadType.REFRESH, refreshState)
+ callback(PageLoadType.START, startState)
+ callback(PageLoadType.END, endState)
}
}
@@ -1143,7 +1115,7 @@
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- open fun setInitialLoadState(loadType: LoadType, loadState: LoadState) {
+ open fun setInitialLoadState(loadType: PageLoadType, loadState: LoadState) {
}
/**
@@ -1170,7 +1142,7 @@
this.refreshRetryCallback = refreshRetryCallback
}
- internal fun dispatchStateChange(type: LoadType, state: LoadState) {
+ internal fun dispatchStateChange(type: PageLoadType, state: LoadState) {
loadStateListeners.removeAll { it.get() == null }
loadStateListeners.forEach { it.get()?.invoke(type, state) }
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
index 9614804..6b6c852 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
@@ -98,9 +98,6 @@
* passed to a [PagedList] to be displayed in a `RecyclerView`
*/
abstract class PagedSource<Key : Any, Value : Any> {
- enum class LoadType {
- INITIAL, START, END
- }
/**
* Params for generic load request on a [PagedSource].
@@ -109,9 +106,9 @@
*/
data class LoadParams<Key : Any>(
/**
- * [LoadType], for different behavior, e.g. only count initial load
+ * [PageLoadType], for different behavior, e.g. only count initial load
*/
- val loadType: LoadType,
+ val loadType: PageLoadType,
/**
* Key for the page to be loaded
*/
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt b/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt
index c6bb7a7..31955c7 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt
@@ -43,14 +43,8 @@
}
override suspend fun load(params: LoadParams<Key>): LoadResult<Key, Value> {
- val loadType = when (params.loadType) {
- LoadType.INITIAL -> DataSource.LoadType.INITIAL
- LoadType.START -> DataSource.LoadType.START
- LoadType.END -> DataSource.LoadType.END
- }
-
val dataSourceParams = DataSource.Params(
- loadType,
+ params.loadType,
params.key,
params.loadSize,
params.placeholdersEnabled,
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
index 96708fc..e198b30 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
@@ -301,7 +301,7 @@
)
}
- override fun onPageResultResolution(type: PagedList.LoadType, result: LoadResult<*, T>) {
+ override fun onPageResultResolution(type: PageLoadType, result: LoadResult<*, T>) {
// ignored
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/Pager.kt b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
index eba5b66..848eb8f 100644
--- a/paging/common/src/main/kotlin/androidx/paging/Pager.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
@@ -17,7 +17,6 @@
package androidx.paging
import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
import androidx.paging.PagedSource.KeyProvider
import androidx.paging.PagedSource.LoadParams
import androidx.paging.PagedSource.LoadResult
@@ -43,7 +42,7 @@
private val detached = AtomicBoolean(false)
var loadStateManager = object : PagedList.LoadStateManager() {
- override fun onStateChanged(type: LoadType, state: LoadState) {
+ override fun onStateChanged(type: PageLoadType, state: LoadState) {
pageConsumer.onStateChanged(type, state)
}
}
@@ -54,7 +53,7 @@
init {
prevKey = result.prevKey
nextKey = result.nextKey
- this.adjacentProvider.onPageResultResolution(LoadType.REFRESH, result)
+ this.adjacentProvider.onPageResultResolution(PageLoadType.REFRESH, result)
totalCount = when (result.counted) {
// only one of leadingNulls / offset may be used
true -> result.itemsBefore + result.data.size + result.itemsAfter
@@ -62,7 +61,7 @@
}
}
- private fun scheduleLoad(type: LoadType, params: LoadParams<K>) {
+ private fun scheduleLoad(type: PageLoadType, params: LoadParams<K>) {
// Listen on the BG thread if the paged source is invalid, since it can be expensive.
pagedListScope.launch(fetchDispatcher) {
try {
@@ -86,18 +85,18 @@
}
}
- private fun onLoadSuccess(type: LoadType, value: LoadResult<K, V>) {
+ private fun onLoadSuccess(type: PageLoadType, value: LoadResult<K, V>) {
if (isDetached) return // abort!
adjacentProvider.onPageResultResolution(type, value)
if (pageConsumer.onPageResult(type, value)) {
when (type) {
- LoadType.START -> {
+ PageLoadType.START -> {
prevKey = value.prevKey
schedulePrepend()
}
- LoadType.END -> {
+ PageLoadType.END -> {
nextKey = value.nextKey
scheduleAppend()
}
@@ -112,7 +111,7 @@
}
}
- private fun onLoadError(type: LoadType, throwable: Throwable) {
+ private fun onLoadError(type: PageLoadType, throwable: Throwable) {
if (isDetached) return // abort!
// TODO: handle nesting
@@ -144,7 +143,7 @@
private fun schedulePrepend() {
if (!canPrepend()) {
- onLoadSuccess(LoadType.START, LoadResult.empty())
+ onLoadSuccess(PageLoadType.START, LoadResult.empty())
return
}
@@ -157,21 +156,21 @@
is KeyProvider.ItemKey -> keyProvider.getKey(adjacentProvider.firstLoadedItem!!)
}
- loadStateManager.setState(LoadType.START, LoadState.Loading)
+ loadStateManager.setState(PageLoadType.START, LoadState.Loading)
val loadParams = LoadParams(
- PagedSource.LoadType.START,
+ PageLoadType.START,
key,
config.pageSize,
config.enablePlaceholders,
config.pageSize
)
- scheduleLoad(LoadType.START, loadParams)
+ scheduleLoad(PageLoadType.START, loadParams)
}
private fun scheduleAppend() {
if (!canAppend()) {
- onLoadSuccess(LoadType.END, LoadResult.empty())
+ onLoadSuccess(PageLoadType.END, LoadResult.empty())
return
}
@@ -186,15 +185,15 @@
)
}
- loadStateManager.setState(LoadType.END, LoadState.Loading)
+ loadStateManager.setState(PageLoadType.END, LoadState.Loading)
val loadParams = LoadParams(
- PagedSource.LoadType.END,
+ PageLoadType.END,
key,
config.pageSize,
config.enablePlaceholders,
config.pageSize
)
- scheduleLoad(LoadType.END, loadParams)
+ scheduleLoad(PageLoadType.END, loadParams)
}
fun retry() {
@@ -212,9 +211,9 @@
/**
* @return `true` if we need to fetch more
*/
- fun onPageResult(type: LoadType, pageResult: LoadResult<*, V>): Boolean
+ fun onPageResult(type: PageLoadType, pageResult: LoadResult<*, V>): Boolean
- fun onStateChanged(type: LoadType, state: LoadState)
+ fun onStateChanged(type: PageLoadType, state: LoadState)
}
internal interface AdjacentProvider<V : Any> {
@@ -230,7 +229,7 @@
* implementation of the AdjacentProvider to handle this (generally by ignoring this call if
* dropping is supported).
*/
- fun onPageResultResolution(type: LoadType, result: LoadResult<*, V>)
+ fun onPageResultResolution(type: PageLoadType, result: LoadResult<*, V>)
}
internal class SimpleAdjacentProvider<V : Any> : AdjacentProvider<V> {
@@ -247,16 +246,16 @@
private var leadingUnloadedCount: Int = 0
private var trailingUnloadedCount: Int = 0
- override fun onPageResultResolution(type: LoadType, result: LoadResult<*, V>) {
+ override fun onPageResultResolution(type: PageLoadType, result: LoadResult<*, V>) {
if (result.data.isEmpty()) return
- if (type == LoadType.START) {
+ if (type == PageLoadType.START) {
firstLoadedItemIndex -= result.data.size
firstLoadedItem = result.data[0]
if (counted) {
leadingUnloadedCount -= result.data.size
}
- } else if (type == LoadType.END) {
+ } else if (type == PageLoadType.END) {
lastLoadedItemIndex += result.data.size
lastLoadedItem = result.data.last()
if (counted) {
diff --git a/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt b/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
index 64b9fb4..8563b66 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
@@ -323,7 +323,7 @@
@Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
internal final override suspend fun load(params: Params<Int>): BaseResult<T> {
- if (params.type == LoadType.INITIAL) {
+ if (params.type == PageLoadType.REFRESH) {
var initialPosition = 0
var initialLoadSize = params.initialLoadSize
if (params.key != null) {
@@ -352,7 +352,7 @@
} else {
var startIndex = params.key!!
var loadSize = params.pageSize
- if (params.type == LoadType.START) {
+ if (params.type == PageLoadType.START) {
loadSize = minOf(loadSize, startIndex + 1)
startIndex = startIndex - loadSize + 1
}
diff --git a/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt b/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
index d83b656..5d1529f 100644
--- a/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
@@ -21,7 +21,6 @@
import androidx.paging.PagedList.Callback
import androidx.paging.PagedList.Config
import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
import androidx.paging.futures.DirectDispatcher
import androidx.testutils.TestDispatcher
import com.nhaarman.mockitokotlin2.mock
@@ -64,9 +63,9 @@
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Item> {
return when (params.loadType) {
- LoadType.INITIAL -> loadInitial(params)
- LoadType.START -> loadBefore(params)
- LoadType.END -> loadAfter(params)
+ PageLoadType.REFRESH -> loadInitial(params)
+ PageLoadType.START -> loadBefore(params)
+ PageLoadType.END -> loadAfter(params)
}
}
@@ -127,7 +126,7 @@
return data
}
- private fun <E : Any> PagedList<E>.addLoadStateCapture(desiredType: LoadType):
+ private fun <E : Any> PagedList<E>.addLoadStateCapture(desiredType: PageLoadType):
MutableList<StateChange> {
val list = mutableListOf<StateChange>()
this.addWeakLoadStateListener { type, state ->
@@ -567,11 +566,11 @@
@Test
fun loadingListenerAppend() {
val pagedList = createCountedPagedList(0)
- val states = pagedList.addLoadStateCapture(LoadType.END)
+ val states = pagedList.addLoadStateCapture(PageLoadType.END)
// No loading going on currently
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.END, LoadState.Idle)),
states.getAllAndClear()
)
verifyRange(0, 40, pagedList)
@@ -580,7 +579,7 @@
pagedList.loadAround(35)
mainThread.executeAll()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Loading)),
+ listOf(StateChange(PageLoadType.END, LoadState.Loading)),
states.getAllAndClear()
)
verifyRange(0, 40, pagedList)
@@ -588,7 +587,7 @@
// load finishes
drain()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.END, LoadState.Idle)),
states.getAllAndClear()
)
verifyRange(0, 60, pagedList)
@@ -599,7 +598,7 @@
pagedList.loadAround(55)
mainThread.executeAll()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Loading)),
+ listOf(StateChange(PageLoadType.END, LoadState.Loading)),
states.getAllAndClear()
)
verifyRange(0, 60, pagedList)
@@ -607,7 +606,7 @@
// load now in error state
drain()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Error(EXCEPTION, true))),
+ listOf(StateChange(PageLoadType.END, LoadState.Error(EXCEPTION, true))),
states.getAllAndClear()
)
verifyRange(0, 60, pagedList)
@@ -616,14 +615,14 @@
pagedList.retry()
mainThread.executeAll()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Loading)),
+ listOf(StateChange(PageLoadType.END, LoadState.Loading)),
states.getAllAndClear()
)
// load finishes
drain()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.END, LoadState.Idle)),
states.getAllAndClear()
)
verifyRange(0, 80, pagedList)
@@ -639,7 +638,7 @@
prefetchDistance = 1,
maxSize = 3
)
- val states = pagedList.addLoadStateCapture(LoadType.START)
+ val states = pagedList.addLoadStateCapture(PageLoadType.START)
// load 3 pages - 2nd, 3rd, 4th
pagedList.loadAround(if (placeholdersEnabled) 2 else 0)
@@ -647,9 +646,9 @@
verifyRange(1, 3, pagedList)
assertEquals(
listOf(
- StateChange(LoadType.START, LoadState.Idle),
- StateChange(LoadType.START, LoadState.Loading),
- StateChange(LoadType.START, LoadState.Idle)
+ StateChange(PageLoadType.START, LoadState.Idle),
+ StateChange(PageLoadType.START, LoadState.Loading),
+ StateChange(PageLoadType.START, LoadState.Idle)
),
states.getAllAndClear()
)
@@ -661,8 +660,8 @@
verifyRange(1, 3, pagedList)
assertEquals(
listOf(
- StateChange(LoadType.START, LoadState.Loading),
- StateChange(LoadType.START, LoadState.Error(EXCEPTION, true))
+ StateChange(PageLoadType.START, LoadState.Loading),
+ StateChange(PageLoadType.START, LoadState.Error(EXCEPTION, true))
),
states.getAllAndClear()
)
@@ -671,7 +670,7 @@
pagedList.loadAround(if (placeholdersEnabled) 3 else 2)
drain()
assertEquals(
- listOf(StateChange(LoadType.START, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.START, LoadState.Idle)),
states.getAllAndClear()
)
verifyRange(2, 3, pagedList)
@@ -687,7 +686,7 @@
prefetchDistance = 1,
maxSize = 3
)
- val states = pagedList.addLoadStateCapture(LoadType.END)
+ val states = pagedList.addLoadStateCapture(PageLoadType.END)
// load 3 pages - 2nd, 3rd, 4th
pagedList.loadAround(if (placeholdersEnabled) 2 else 0)
@@ -695,9 +694,9 @@
verifyRange(1, 3, pagedList)
assertEquals(
listOf(
- StateChange(LoadType.END, LoadState.Idle),
- StateChange(LoadType.END, LoadState.Loading),
- StateChange(LoadType.END, LoadState.Idle)
+ StateChange(PageLoadType.END, LoadState.Idle),
+ StateChange(PageLoadType.END, LoadState.Loading),
+ StateChange(PageLoadType.END, LoadState.Idle)
),
states.getAllAndClear()
)
@@ -709,8 +708,8 @@
verifyRange(1, 3, pagedList)
assertEquals(
listOf(
- StateChange(LoadType.END, LoadState.Loading),
- StateChange(LoadType.END, LoadState.Error(EXCEPTION, true))
+ StateChange(PageLoadType.END, LoadState.Loading),
+ StateChange(PageLoadType.END, LoadState.Error(EXCEPTION, true))
),
states.getAllAndClear()
)
@@ -719,7 +718,7 @@
pagedList.loadAround(if (placeholdersEnabled) 1 else 0)
drain()
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.END, LoadState.Idle)),
states.getAllAndClear()
)
verifyRange(0, 3, pagedList)
@@ -731,7 +730,7 @@
val pagedList = createCountedPagedList(0)
val states = mutableListOf<StateChange>()
pagedList.addWeakLoadStateListener { type, state ->
- if (type == LoadType.END) {
+ if (type == PageLoadType.END) {
states.add(StateChange(type, state))
}
}
@@ -741,9 +740,9 @@
drain()
assertEquals(
listOf(
- StateChange(LoadType.END, LoadState.Idle),
- StateChange(LoadType.END, LoadState.Loading),
- StateChange(LoadType.END, LoadState.Error(EXCEPTION, true))
+ StateChange(PageLoadType.END, LoadState.Idle),
+ StateChange(PageLoadType.END, LoadState.Loading),
+ StateChange(PageLoadType.END, LoadState.Error(EXCEPTION, true))
),
states.getAllAndClear()
)
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
index 23dee77..c05bcf2 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
@@ -17,8 +17,11 @@
package androidx.paging
import androidx.paging.ContiguousPagedListTest.Companion.EXCEPTION
+import androidx.paging.PageLoadType.REFRESH
+import androidx.paging.PagedList.Builder
+import androidx.paging.PagedList.Config
+import androidx.paging.PagedList.LoadState
import androidx.paging.PagedList.LoadStateManager
-import androidx.paging.PagedList.LoadType.REFRESH
import androidx.paging.futures.DirectDispatcher
import androidx.testutils.TestDispatcher
import androidx.testutils.TestExecutor
@@ -43,7 +46,7 @@
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, String> =
when (params.loadType) {
- LoadType.INITIAL -> LoadResult(
+ REFRESH -> LoadResult(
data = listOf("a"),
itemsBefore = 0,
itemsAfter = 0
@@ -62,7 +65,7 @@
@Test
fun createLegacy() {
@Suppress("DEPRECATION")
- val pagedList = PagedList.Builder(ListDataSource(ITEMS), 100)
+ val pagedList = Builder(ListDataSource(ITEMS), 100)
.setNotifyExecutor(TestExecutor())
.setFetchExecutor(TestExecutor())
.build()
@@ -72,7 +75,7 @@
@Test
fun createAsync() {
- val config = PagedList.Config.Builder()
+ val config = Config.Builder()
.setPageSize(10)
.setEnablePlaceholders(false)
.build()
@@ -112,7 +115,7 @@
override fun isRetryableError(error: Throwable) = false
}
- val config = PagedList.Config.Builder()
+ val config = Config.Builder()
.setPageSize(10)
.setEnablePlaceholders(false)
.build()
@@ -141,7 +144,7 @@
@Test
fun defaults() = runBlocking {
- val pagedList = PagedList.Builder(pagedSource, config)
+ val pagedList = Builder(pagedSource, config)
.setNotifyDispatcher(DirectDispatcher)
.setFetchDispatcher(DirectDispatcher)
.buildAsync()
@@ -154,13 +157,13 @@
fun setState_Error() {
var onStateChangeCalls = 0
val loadStateManager = object : LoadStateManager() {
- override fun onStateChanged(type: PagedList.LoadType, state: PagedList.LoadState) {
+ override fun onStateChanged(type: PageLoadType, state: LoadState) {
onStateChangeCalls++
}
}
- loadStateManager.setState(REFRESH, PagedList.LoadState.Error(EXCEPTION, true))
- loadStateManager.setState(REFRESH, PagedList.LoadState.Error(EXCEPTION, true))
+ loadStateManager.setState(REFRESH, LoadState.Error(EXCEPTION, true))
+ loadStateManager.setState(REFRESH, LoadState.Error(EXCEPTION, true))
assertEquals(1, onStateChangeCalls)
}
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt
index 438fdae..e4ac159 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt
@@ -19,7 +19,6 @@
import androidx.paging.PagedSource.LoadParams
import androidx.paging.PagedSource.LoadResult
import androidx.paging.PagedSource.LoadResult.Companion.COUNT_UNDEFINED
-import androidx.paging.PagedSource.LoadType
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertSame
@@ -43,7 +42,7 @@
): LoadResult<Key, Item> {
return pagedSource.load(
LoadParams(
- LoadType.INITIAL,
+ PageLoadType.REFRESH,
key,
initialLoadSize,
enablePlaceholders,
@@ -65,7 +64,7 @@
// Verify error is propagated correctly.
pagedSource.enqueueError()
- val errorParams = LoadParams(LoadType.INITIAL, key, 10, false, 10)
+ val errorParams = LoadParams(PageLoadType.REFRESH, key, 10, false, 10)
assertFailsWith<CustomException> {
pagedSource.load(errorParams)
}
@@ -197,7 +196,7 @@
runBlocking {
val key = dataSource.keyProvider.getKey(ITEMS_BY_NAME_ID[5])
- val params = LoadParams(LoadType.START, key, 5, false, 5)
+ val params = LoadParams(PageLoadType.START, key, 5, false, 5)
val observed = dataSource.load(params).data
assertEquals(ITEMS_BY_NAME_ID.subList(0, 5), observed)
@@ -205,7 +204,7 @@
// Verify error is propagated correctly.
dataSource.enqueueError()
assertFailsWith<CustomException> {
- val errorParams = LoadParams(LoadType.START, key, 5, false, 5)
+ val errorParams = LoadParams(PageLoadType.START, key, 5, false, 5)
dataSource.load(errorParams)
}
}
@@ -217,7 +216,7 @@
runBlocking {
val key = dataSource.keyProvider.getKey(ITEMS_BY_NAME_ID[5])
- val params = LoadParams(LoadType.END, key, 5, false, 5)
+ val params = LoadParams(PageLoadType.END, key, 5, false, 5)
val observed = dataSource.load(params).data
assertEquals(ITEMS_BY_NAME_ID.subList(6, 11), observed)
@@ -225,7 +224,7 @@
// Verify error is propagated correctly.
dataSource.enqueueError()
assertFailsWith<CustomException> {
- val errorParams = LoadParams(LoadType.END, key, 5, false, 5)
+ val errorParams = LoadParams(PageLoadType.END, key, 5, false, 5)
dataSource.load(errorParams)
}
}
@@ -269,9 +268,9 @@
override suspend fun load(params: LoadParams<Key>): LoadResult<Key, Item> {
return when (params.loadType) {
- LoadType.INITIAL -> loadInitial(params)
- LoadType.START -> loadBefore(params)
- LoadType.END -> loadAfter(params)
+ PageLoadType.REFRESH -> loadInitial(params)
+ PageLoadType.START -> loadBefore(params)
+ PageLoadType.END -> loadAfter(params)
}
}
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
index 72e1fa7..ed28898 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
@@ -18,7 +18,6 @@
import androidx.paging.PagedList.Config
import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
import androidx.paging.PagedSource.LoadResult
import androidx.paging.futures.DirectDispatcher
import androidx.testutils.TestExecutor
@@ -67,7 +66,7 @@
PositionalDataSource.RangeResult(data.subList(start, end)).toLoadResult<Int>()
private data class Result(
- val type: LoadType,
+ val type: PageLoadType,
val pageResult: LoadResult<*, String>
)
@@ -88,14 +87,14 @@
}
override fun onPageResult(
- type: LoadType,
+ type: PageLoadType,
pageResult: LoadResult<*, String>
): Boolean {
results.add(Result(type, pageResult))
return false
}
- override fun onStateChanged(type: LoadType, state: LoadState) {
+ override fun onStateChanged(type: PageLoadType, state: LoadState) {
stateChanges.add(StateChange(type, state))
}
}
@@ -135,15 +134,15 @@
assertTrue(consumer.takeResults().isEmpty())
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Loading)),
+ listOf(StateChange(PageLoadType.END, LoadState.Loading)),
consumer.takeStateChanges()
)
testExecutor.executeAll()
- assertEquals(listOf(Result(LoadType.END, rangeResult(6, 8))), consumer.takeResults())
+ assertEquals(listOf(Result(PageLoadType.END, rangeResult(6, 8))), consumer.takeResults())
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.END, LoadState.Idle)),
consumer.takeStateChanges()
)
}
@@ -157,15 +156,15 @@
assertTrue(consumer.takeResults().isEmpty())
assertEquals(
- listOf(StateChange(LoadType.START, LoadState.Loading)),
+ listOf(StateChange(PageLoadType.START, LoadState.Loading)),
consumer.takeStateChanges()
)
testExecutor.executeAll()
- assertEquals(listOf(Result(LoadType.START, rangeResult(2, 4))), consumer.takeResults())
+ assertEquals(listOf(Result(PageLoadType.START, rangeResult(2, 4))), consumer.takeResults())
assertEquals(
- listOf(StateChange(LoadType.START, LoadState.Idle)),
+ listOf(StateChange(PageLoadType.START, LoadState.Idle)),
consumer.takeStateChanges()
)
}
@@ -182,16 +181,16 @@
assertEquals(
listOf(
- Result(LoadType.END, rangeResult(6, 8)),
- Result(LoadType.END, rangeResult(8, 9))
+ Result(PageLoadType.END, rangeResult(6, 8)),
+ Result(PageLoadType.END, rangeResult(8, 9))
), consumer.takeResults()
)
assertEquals(
listOf(
- StateChange(LoadType.END, LoadState.Loading),
- StateChange(LoadType.END, LoadState.Idle),
- StateChange(LoadType.END, LoadState.Loading),
- StateChange(LoadType.END, LoadState.Idle)
+ StateChange(PageLoadType.END, LoadState.Loading),
+ StateChange(PageLoadType.END, LoadState.Idle),
+ StateChange(PageLoadType.END, LoadState.Loading),
+ StateChange(PageLoadType.END, LoadState.Idle)
),
consumer.takeStateChanges()
)
@@ -209,16 +208,16 @@
assertEquals(
listOf(
- Result(LoadType.START, rangeResult(2, 4)),
- Result(LoadType.START, rangeResult(0, 2))
+ Result(PageLoadType.START, rangeResult(2, 4)),
+ Result(PageLoadType.START, rangeResult(0, 2))
), consumer.takeResults()
)
assertEquals(
listOf(
- StateChange(LoadType.START, LoadState.Loading),
- StateChange(LoadType.START, LoadState.Idle),
- StateChange(LoadType.START, LoadState.Loading),
- StateChange(LoadType.START, LoadState.Idle)
+ StateChange(PageLoadType.START, LoadState.Loading),
+ StateChange(PageLoadType.START, LoadState.Idle),
+ StateChange(PageLoadType.START, LoadState.Loading),
+ StateChange(PageLoadType.START, LoadState.Idle)
),
consumer.takeStateChanges()
)
@@ -233,11 +232,11 @@
// Pager triggers an immediate empty response here, so we don't need to flush the executor
assertEquals(
- listOf(Result(LoadType.END, LoadResult.empty<Int, String>())),
+ listOf(Result(PageLoadType.END, LoadResult.empty<Int, String>())),
consumer.takeResults()
)
assertEquals(
- listOf(StateChange(LoadType.END, LoadState.Done)),
+ listOf(StateChange(PageLoadType.END, LoadState.Done)),
consumer.takeStateChanges()
)
}
@@ -251,11 +250,11 @@
// Pager triggers an immediate empty response here, so we don't need to flush the executor
assertEquals(
- listOf(Result(LoadType.START, LoadResult.empty<Int, String>())),
+ listOf(Result(PageLoadType.START, LoadResult.empty<Int, String>())),
consumer.takeResults()
)
assertEquals(
- listOf(StateChange(LoadType.START, LoadState.Done)),
+ listOf(StateChange(PageLoadType.START, LoadState.Done)),
consumer.takeStateChanges()
)
}
diff --git a/paging/common/src/test/kotlin/androidx/paging/StateChange.kt b/paging/common/src/test/kotlin/androidx/paging/StateChange.kt
index 31ba66e..c7fd2bc 100644
--- a/paging/common/src/test/kotlin/androidx/paging/StateChange.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/StateChange.kt
@@ -17,6 +17,5 @@
package androidx.paging
import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
-internal data class StateChange(val type: LoadType, val state: LoadState)
+internal data class StateChange(val type: PageLoadType, val state: LoadState)
diff --git a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt
index 857c84d..fa1a3b8 100644
--- a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt
+++ b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt
@@ -18,6 +18,7 @@
import android.graphics.Color
import androidx.annotation.ColorInt
+import androidx.paging.PageLoadType
import androidx.paging.PagedSource
import java.util.ArrayList
import java.util.concurrent.atomic.AtomicBoolean
@@ -31,7 +32,7 @@
override val keyProvider = KeyProvider.Positional
override suspend fun load(params: LoadParams<Int>) = when (params.loadType) {
- LoadType.INITIAL -> loadInitial(params)
+ PageLoadType.REFRESH -> loadInitial(params)
else -> loadRange(params)
}
diff --git a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt
index b25b23d..063a4e5 100644
--- a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt
+++ b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt
@@ -21,14 +21,15 @@
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
+import androidx.paging.PageLoadType
import androidx.paging.PagedList
import androidx.paging.PagedList.LoadState.Done
import androidx.paging.PagedList.LoadState.Error
import androidx.paging.PagedList.LoadState.Idle
import androidx.paging.PagedList.LoadState.Loading
-import androidx.paging.PagedList.LoadType.END
-import androidx.paging.PagedList.LoadType.REFRESH
-import androidx.paging.PagedList.LoadType.START
+import androidx.paging.PageLoadType.END
+import androidx.paging.PageLoadType.REFRESH
+import androidx.paging.PageLoadType.START
import androidx.paging.PagedListAdapter
import androidx.paging.integration.testapp.R
import androidx.recyclerview.widget.RecyclerView
@@ -75,7 +76,7 @@
adapter.currentList?.retry()
}
- adapter.addLoadStateListener { type: PagedList.LoadType, state: PagedList.LoadState ->
+ adapter.addLoadStateListener { type: PageLoadType, state: PagedList.LoadState ->
val button = when (type) {
REFRESH -> buttonRefresh
START -> buttonStart
diff --git a/paging/runtime/api/3.0.0-alpha01.txt b/paging/runtime/api/3.0.0-alpha01.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/3.0.0-alpha01.txt
+++ b/paging/runtime/api/3.0.0-alpha01.txt
@@ -4,13 +4,13 @@
public class AsyncPagedListDiffer<T> {
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method public T? getItem(int index);
method public int getItemCount();
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method protected T? getItem(int position);
method public int getItemCount();
method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
- method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/api/current.txt b/paging/runtime/api/current.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/current.txt
+++ b/paging/runtime/api/current.txt
@@ -4,13 +4,13 @@
public class AsyncPagedListDiffer<T> {
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method public T? getItem(int index);
method public int getItemCount();
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method protected T? getItem(int position);
method public int getItemCount();
method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
- method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/api/restricted_3.0.0-alpha01.txt b/paging/runtime/api/restricted_3.0.0-alpha01.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/restricted_3.0.0-alpha01.txt
+++ b/paging/runtime/api/restricted_3.0.0-alpha01.txt
@@ -4,13 +4,13 @@
public class AsyncPagedListDiffer<T> {
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method public T? getItem(int index);
method public int getItemCount();
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method protected T? getItem(int position);
method public int getItemCount();
method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
- method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/api/restricted_current.txt b/paging/runtime/api/restricted_current.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/restricted_current.txt
+++ b/paging/runtime/api/restricted_current.txt
@@ -4,13 +4,13 @@
public class AsyncPagedListDiffer<T> {
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method public T? getItem(int index);
method public int getItemCount();
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public androidx.paging.PagedList<T>? getCurrentList();
method protected T? getItem(int position);
method public int getItemCount();
method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
- method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
- method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+ method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
method public void submitList(androidx.paging.PagedList<T>? pagedList);
method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
index 1d53152..9ac83e2 100644
--- a/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
@@ -25,7 +25,7 @@
import androidx.paging.PagedList.LoadState.Error
import androidx.paging.PagedList.LoadState.Idle
import androidx.paging.PagedList.LoadState.Loading
-import androidx.paging.PagedList.LoadType.REFRESH
+import androidx.paging.PageLoadType.REFRESH
import androidx.test.filters.SmallTest
import androidx.testutils.TestDispatcher
import androidx.testutils.TestExecutor
@@ -64,7 +64,7 @@
}
private data class LoadState(
- val type: PagedList.LoadType,
+ val type: PageLoadType,
val state: PagedList.LoadState
)
@@ -111,7 +111,7 @@
override val keyProvider = KeyProvider.Positional
override suspend fun load(params: LoadParams<Int>) = when (params.loadType) {
- LoadType.INITIAL -> loadInitial(params)
+ PageLoadType.REFRESH -> loadInitial(params)
else -> loadRange()
}
diff --git a/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt b/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt
index cb2d31d..506e5dc 100644
--- a/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt
+++ b/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt
@@ -21,7 +21,6 @@
import androidx.lifecycle.LiveData
import androidx.paging.PagedList.LoadState
import androidx.paging.PagedList.LoadStateManager
-import androidx.paging.PagedList.LoadType
import androidx.recyclerview.widget.AdapterListUpdateCallback
import androidx.recyclerview.widget.AsyncDifferConfig
import androidx.recyclerview.widget.DiffUtil
@@ -141,7 +140,7 @@
internal var maxScheduledGeneration: Int = 0
private val loadStateManager: LoadStateManager = object : LoadStateManager() {
- override fun onStateChanged(type: LoadType, state: LoadState) {
+ override fun onStateChanged(type: PageLoadType, state: LoadState) {
// Don't need to post - PagedList will already have done that
loadStateListeners.forEach { it(type, state) }
}
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index 0a7be66..c6a5582 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -18,7 +18,7 @@
import androidx.arch.core.executor.ArchTaskExecutor
import androidx.lifecycle.LiveData
-import androidx.paging.PagedList.LoadType.REFRESH
+import androidx.paging.PageLoadType.REFRESH
import androidx.paging.PagedList.LoadState.Error
import androidx.paging.PagedList.LoadState.Loading
import kotlinx.coroutines.CoroutineDispatcher
diff --git a/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt b/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
index 9f10b64..418fd3e 100644
--- a/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
+++ b/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
@@ -17,7 +17,6 @@
package androidx.paging
import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
import androidx.recyclerview.widget.AdapterListUpdateCallback
import androidx.recyclerview.widget.AsyncDifferConfig
import androidx.recyclerview.widget.DiffUtil
@@ -231,10 +230,10 @@
* REFRESH events can be used to drive a `SwipeRefreshLayout`, or START/END events
* can be used to drive loading spinner items in the Adapter.
*
- * @param type [LoadType] Can be START, END, or REFRESH
+ * @param type [PageLoadType] Can be START, END, or REFRESH
* @param state [LoadState] IDLE, LOADING, DONE, ERROR, or RETRYABLE_ERROR
*/
- open fun onLoadStateChanged(type: LoadType, state: LoadState) {
+ open fun onLoadStateChanged(type: PageLoadType, state: LoadState) {
}
/**
diff --git a/palette/palette/build.gradle b/palette/palette/build.gradle
index 1a785db..87eb258b 100644
--- a/palette/palette/build.gradle
+++ b/palette/palette/build.gradle
@@ -9,7 +9,7 @@
}
dependencies {
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.1.0")
annotationProcessor(NULLAWAY)
diff --git a/percentlayout/percentlayout/build.gradle b/percentlayout/percentlayout/build.gradle
index 5b2ac05..e5c8470 100644
--- a/percentlayout/percentlayout/build.gradle
+++ b/percentlayout/percentlayout/build.gradle
@@ -10,7 +10,7 @@
dependencies {
api(ANDROIDX_ANNOTATION)
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/preference/preference/build.gradle b/preference/preference/build.gradle
index 43b0f07..8235c7a 100644
--- a/preference/preference/build.gradle
+++ b/preference/preference/build.gradle
@@ -30,7 +30,7 @@
implementation("androidx.annotation:annotation:1.1.0")
api("androidx.appcompat:appcompat:1.1.0-rc01")
// TODO: change to alpha05 after release
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
api("androidx.fragment:fragment:1.1.0-rc01")
api("androidx.recyclerview:recyclerview:1.0.0")
diff --git a/recyclerview/recyclerview-selection/build.gradle b/recyclerview/recyclerview-selection/build.gradle
index ac2f787..a364be0 100644
--- a/recyclerview/recyclerview-selection/build.gradle
+++ b/recyclerview/recyclerview-selection/build.gradle
@@ -27,7 +27,7 @@
dependencies {
api(project(":recyclerview:recyclerview"))
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/recyclerview/recyclerview/api/1.1.0-beta04.txt b/recyclerview/recyclerview/api/1.1.0-beta04.txt
new file mode 100644
index 0000000..2e41ff1
--- /dev/null
+++ b/recyclerview/recyclerview/api/1.1.0-beta04.txt
@@ -0,0 +1,1037 @@
+// 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 android.graphics.drawable.Drawable? getDrawable();
+ 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 protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, 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 @Deprecated 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 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 smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+ 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 UNDEFINED_DURATION = -2147483648; // 0x80000000
+ 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/res-1.1.0-beta04.txt b/recyclerview/recyclerview/api/res-1.1.0-beta04.txt
new file mode 100644
index 0000000..475bfc43
--- /dev/null
+++ b/recyclerview/recyclerview/api/res-1.1.0-beta04.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/api/restricted_1.1.0-beta04.txt b/recyclerview/recyclerview/api/restricted_1.1.0-beta04.txt
new file mode 100644
index 0000000..0690168
--- /dev/null
+++ b/recyclerview/recyclerview/api/restricted_1.1.0-beta04.txt
@@ -0,0 +1,1043 @@
+// 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 android.graphics.drawable.Drawable? getDrawable();
+ 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, @androidx.recyclerview.widget.RecyclerView.Orientation 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!, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
+ ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+ method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, 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 @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+ method public int getInitialPrefetchItemCount();
+ method @androidx.recyclerview.widget.RecyclerView.Orientation public int getOrientation();
+ method public boolean getRecycleChildrenOnDetach();
+ method public boolean getReverseLayout();
+ method public boolean getStackFromEnd();
+ method protected boolean isLayoutRTL();
+ method public boolean isSmoothScrollbarEnabled();
+ method public void prepareForDrop(android.view.View, android.view.View, int, int);
+ method public void scrollToPositionWithOffset(int, int);
+ method public void setInitialPrefetchItemCount(int);
+ method public void setOrientation(@androidx.recyclerview.widget.RecyclerView.Orientation 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!, @androidx.recyclerview.widget.RecyclerView.Orientation 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 smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+ 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 UNDEFINED_DURATION = -2147483648; // 0x80000000
+ 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);
+ }
+
+ @IntDef({androidx.recyclerview.widget.RecyclerView.HORIZONTAL, androidx.recyclerview.widget.RecyclerView.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.Orientation {
+ }
+
+ 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/build.gradle b/recyclerview/recyclerview/build.gradle
index 16d7734..4ec3faf 100644
--- a/recyclerview/recyclerview/build.gradle
+++ b/recyclerview/recyclerview/build.gradle
@@ -11,7 +11,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc02")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
api("androidx.customview:customview:1.0.0")
diff --git a/room/common/api/2.2.0-beta01.ignore b/room/common/api/2.2.0-beta01.ignore
new file mode 100644
index 0000000..51b51d5
--- /dev/null
+++ b/room/common/api/2.2.0-beta01.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+ChangedType: androidx.room.Database#entities():
+ Method androidx.room.Database.entities has changed return type from Class[] to Class<?>[]
+ChangedType: androidx.room.Database#views():
+ Method androidx.room.Database.views has changed return type from Class[] to Class<?>[]
+ChangedType: androidx.room.ForeignKey#entity():
+ Method androidx.room.ForeignKey.entity has changed return type from Class to Class<?>
+ChangedType: androidx.room.Fts4#contentEntity():
+ Method androidx.room.Fts4.contentEntity has changed return type from Class to Class<?>
+ChangedType: androidx.room.RawQuery#observedEntities():
+ Method androidx.room.RawQuery.observedEntities has changed return type from Class[] to Class<?>[]
+ChangedType: androidx.room.Relation#entity():
+ Method androidx.room.Relation.entity has changed return type from Class to Class<?>
diff --git a/room/common/api/2.2.0-beta01.txt b/room/common/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..238967d
--- /dev/null
+++ b/room/common/api/2.2.0-beta01.txt
@@ -0,0 +1,197 @@
+// Signature format: 3.0
+package androidx.room {
+
+ @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 ColumnInfo {
+ method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+ method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+ method public abstract boolean index() default false;
+ method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+ method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+ field public static final int BINARY = 2; // 0x2
+ field public static final int BLOB = 5; // 0x5
+ field public static final String INHERIT_FIELD_NAME = "[field-name]";
+ field public static final int INTEGER = 3; // 0x3
+ field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+ field public static final int NOCASE = 3; // 0x3
+ field public static final int REAL = 4; // 0x4
+ field public static final int RTRIM = 4; // 0x4
+ field public static final int TEXT = 2; // 0x2
+ field public static final int UNDEFINED = 1; // 0x1
+ field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+ field public static final int UNSPECIFIED = 1; // 0x1
+ field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+ }
+
+ @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
+ }
+
+ @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.SQLiteTypeAffinity {
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Dao {
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Database {
+ method public abstract Class<?>[] entities();
+ method public abstract boolean exportSchema() default true;
+ method public abstract int version();
+ method public abstract Class<?>[] views() default {};
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface DatabaseView {
+ method public abstract String value() default "";
+ method public abstract String viewName() default "";
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Delete {
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ }
+
+ @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 Embedded {
+ method public abstract String prefix() default "";
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Entity {
+ method public abstract androidx.room.ForeignKey[] foreignKeys() default {};
+ method public abstract String[] ignoredColumns() default {};
+ method public abstract androidx.room.Index[] indices() default {};
+ method public abstract boolean inheritSuperIndices() default false;
+ method public abstract String[] primaryKeys() default {};
+ method public abstract String tableName() default "";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ForeignKey {
+ method public abstract String[] childColumns();
+ method public abstract boolean deferred() default false;
+ method public abstract Class<?> entity();
+ method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+ method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+ method public abstract String[] parentColumns();
+ field public static final int CASCADE = 5; // 0x5
+ field public static final int NO_ACTION = 1; // 0x1
+ field public static final int RESTRICT = 2; // 0x2
+ field public static final int SET_DEFAULT = 4; // 0x4
+ field public static final int SET_NULL = 3; // 0x3
+ }
+
+ @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ForeignKey.Action {
+ }
+
+ @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts3 {
+ method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+ method public abstract String[] tokenizerArgs() default {};
+ }
+
+ @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts4 {
+ method public abstract Class<?> contentEntity() default java.lang.Object.class;
+ method public abstract String languageId() default "";
+ method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+ method public abstract String[] notIndexed() default {};
+ method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+ method public abstract int[] prefix() default {};
+ method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+ method public abstract String[] tokenizerArgs() default {};
+ }
+
+ public class FtsOptions {
+ field public static final String TOKENIZER_ICU = "icu";
+ field public static final String TOKENIZER_PORTER = "porter";
+ field public static final String TOKENIZER_SIMPLE = "simple";
+ field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+ }
+
+ public enum FtsOptions.MatchInfo {
+ enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+ enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+ }
+
+ public enum FtsOptions.Order {
+ enum_constant public static final androidx.room.FtsOptions.Order ASC;
+ enum_constant public static final androidx.room.FtsOptions.Order DESC;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.CONSTRUCTOR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Ignore {
+ }
+
+ @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Index {
+ method public abstract String name() default "";
+ method public abstract boolean unique() default false;
+ method public abstract String[] value();
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Insert {
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+ }
+
+ @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Junction {
+ method public abstract String entityColumn() default "";
+ method public abstract String parentColumn() default "";
+ method public abstract Class<?> value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @IntDef({androidx.room.OnConflictStrategy.REPLACE, androidx.room.OnConflictStrategy.ROLLBACK, androidx.room.OnConflictStrategy.ABORT, androidx.room.OnConflictStrategy.FAIL, androidx.room.OnConflictStrategy.IGNORE}) public @interface OnConflictStrategy {
+ field public static final int ABORT = 3; // 0x3
+ field @Deprecated public static final int FAIL = 4; // 0x4
+ field public static final int IGNORE = 5; // 0x5
+ field public static final int REPLACE = 1; // 0x1
+ field @Deprecated public static final int ROLLBACK = 2; // 0x2
+ }
+
+ @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 PrimaryKey {
+ method public abstract boolean autoGenerate() default false;
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Query {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface RawQuery {
+ method public abstract Class<?>[] observedEntities() default {};
+ }
+
+ @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 Relation {
+ method public abstract androidx.room.Junction associateBy() default @androidx.room.Junction;
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ method public abstract String entityColumn();
+ method public abstract String parentColumn();
+ method public abstract String[] projection() default {};
+ }
+
+ public class RoomWarnings {
+ ctor @Deprecated public RoomWarnings();
+ field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+ field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+ field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+ field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+ field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+ field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+ field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+ field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+ field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+ field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+ field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+ field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+ field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SkipQueryVerification {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Transaction {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverter {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverters {
+ method public abstract Class<?>[] value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Update {
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+ }
+
+}
+
diff --git a/room/common/api/restricted_2.2.0-beta01.txt b/room/common/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..ed6c4ee
--- /dev/null
+++ b/room/common/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,206 @@
+// Signature format: 3.0
+package androidx.room {
+
+ @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 ColumnInfo {
+ method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+ method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+ method public abstract boolean index() default false;
+ method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+ method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+ field public static final int BINARY = 2; // 0x2
+ field public static final int BLOB = 5; // 0x5
+ field public static final String INHERIT_FIELD_NAME = "[field-name]";
+ field public static final int INTEGER = 3; // 0x3
+ field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+ field public static final int NOCASE = 3; // 0x3
+ field public static final int REAL = 4; // 0x4
+ field public static final int RTRIM = 4; // 0x4
+ field public static final int TEXT = 2; // 0x2
+ field public static final int UNDEFINED = 1; // 0x1
+ field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+ field public static final int UNSPECIFIED = 1; // 0x1
+ field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+ }
+
+ @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
+ }
+
+ @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.SQLiteTypeAffinity {
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Dao {
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Database {
+ method public abstract Class<?>[] entities();
+ method public abstract boolean exportSchema() default true;
+ method public abstract int version();
+ method public abstract Class<?>[] views() default {};
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface DatabaseView {
+ method public abstract String value() default "";
+ method public abstract String viewName() default "";
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Delete {
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ }
+
+ @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 Embedded {
+ method public abstract String prefix() default "";
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Entity {
+ method public abstract androidx.room.ForeignKey[] foreignKeys() default {};
+ method public abstract String[] ignoredColumns() default {};
+ method public abstract androidx.room.Index[] indices() default {};
+ method public abstract boolean inheritSuperIndices() default false;
+ method public abstract String[] primaryKeys() default {};
+ method public abstract String tableName() default "";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ForeignKey {
+ method public abstract String[] childColumns();
+ method public abstract boolean deferred() default false;
+ method public abstract Class<?> entity();
+ method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+ method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+ method public abstract String[] parentColumns();
+ field public static final int CASCADE = 5; // 0x5
+ field public static final int NO_ACTION = 1; // 0x1
+ field public static final int RESTRICT = 2; // 0x2
+ field public static final int SET_DEFAULT = 4; // 0x4
+ field public static final int SET_NULL = 3; // 0x3
+ }
+
+ @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ForeignKey.Action {
+ }
+
+ @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts3 {
+ method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+ method public abstract String[] tokenizerArgs() default {};
+ }
+
+ @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts4 {
+ method public abstract Class<?> contentEntity() default java.lang.Object.class;
+ method public abstract String languageId() default "";
+ method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+ method public abstract String[] notIndexed() default {};
+ method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+ method public abstract int[] prefix() default {};
+ method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+ method public abstract String[] tokenizerArgs() default {};
+ }
+
+ public class FtsOptions {
+ field public static final String TOKENIZER_ICU = "icu";
+ field public static final String TOKENIZER_PORTER = "porter";
+ field public static final String TOKENIZER_SIMPLE = "simple";
+ field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+ }
+
+ public enum FtsOptions.MatchInfo {
+ enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+ enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+ }
+
+ public enum FtsOptions.Order {
+ enum_constant public static final androidx.room.FtsOptions.Order ASC;
+ enum_constant public static final androidx.room.FtsOptions.Order DESC;
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.CONSTRUCTOR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Ignore {
+ }
+
+ @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Index {
+ method public abstract String name() default "";
+ method public abstract boolean unique() default false;
+ method public abstract String[] value();
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Insert {
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+ }
+
+ @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Junction {
+ method public abstract String entityColumn() default "";
+ method public abstract String parentColumn() default "";
+ method public abstract Class<?> value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @IntDef({androidx.room.OnConflictStrategy.REPLACE, androidx.room.OnConflictStrategy.ROLLBACK, androidx.room.OnConflictStrategy.ABORT, androidx.room.OnConflictStrategy.FAIL, androidx.room.OnConflictStrategy.IGNORE}) public @interface OnConflictStrategy {
+ field public static final int ABORT = 3; // 0x3
+ field @Deprecated public static final int FAIL = 4; // 0x4
+ field public static final int IGNORE = 5; // 0x5
+ field public static final int REPLACE = 1; // 0x1
+ field @Deprecated public static final int ROLLBACK = 2; // 0x2
+ }
+
+ @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 PrimaryKey {
+ method public abstract boolean autoGenerate() default false;
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Query {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface RawQuery {
+ method public abstract Class<?>[] observedEntities() default {};
+ }
+
+ @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 Relation {
+ method public abstract androidx.room.Junction associateBy() default @androidx.room.Junction;
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ method public abstract String entityColumn();
+ method public abstract String parentColumn();
+ method public abstract String[] projection() default {};
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomMasterTable {
+ method public static String! createInsertQuery(String!);
+ field public static final String CREATE_QUERY = "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)";
+ field public static final String DEFAULT_ID = "42";
+ field public static final String NAME = "room_master_table";
+ field public static final String READ_QUERY = "SELECT identity_hash FROM room_master_table WHERE id = 42 LIMIT 1";
+ field public static final String TABLE_NAME = "room_master_table";
+ }
+
+ public class RoomWarnings {
+ ctor @Deprecated public RoomWarnings();
+ field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+ field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+ field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+ field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+ field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+ field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+ field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+ field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+ field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+ field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+ field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+ field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+ field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SkipQueryVerification {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Transaction {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverter {
+ }
+
+ @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverters {
+ method public abstract Class<?>[] value();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Update {
+ method public abstract Class<?> entity() default java.lang.Object.class;
+ method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+ }
+
+}
+
diff --git a/room/guava/api/2.2.0-beta01.txt b/room/guava/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/room/guava/api/2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/guava/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/guava/api/res-2.2.0-beta01.txt
diff --git a/room/guava/api/restricted_2.2.0-beta01.txt b/room/guava/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..b39d410
--- /dev/null
+++ b/room/guava/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room.guava {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class GuavaRoom {
+ method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+ method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(androidx.room.RoomDatabase!, java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+ method public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(androidx.room.RoomDatabase!, boolean, java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+ method public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, boolean, java.util.concurrent.Callable<T!>, androidx.room.RoomSQLiteQuery, boolean, android.os.CancellationSignal?);
+ method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, java.util.concurrent.Callable<T!>);
+ method public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, boolean, java.util.concurrent.Callable<T!>);
+ }
+
+}
+
diff --git a/room/guava/build.gradle b/room/guava/build.gradle
index 4de80a2..a167763 100644
--- a/room/guava/build.gradle
+++ b/room/guava/build.gradle
@@ -33,7 +33,7 @@
implementation(ARCH_CORE_RUNTIME)
api(SUPPORT_ANNOTATIONS)
- api(GUAVA_ANDROID)
+ implementation(GUAVA_ANDROID)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
androidTestImplementation(TRUTH)
}
diff --git a/room/ktx/api/2.2.0-beta01.txt b/room/ktx/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..cee69e3
--- /dev/null
+++ b/room/ktx/api/2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room {
+
+ public final class CoroutinesRoomKt {
+ ctor public CoroutinesRoomKt();
+ }
+
+ public final class RoomDatabaseKt {
+ ctor public RoomDatabaseKt();
+ method public static suspend <R> Object! withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/ktx/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/ktx/api/res-2.2.0-beta01.txt
diff --git a/room/ktx/api/restricted_2.2.0-beta01.txt b/room/ktx/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..20837edc
--- /dev/null
+++ b/room/ktx/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,25 @@
+// Signature format: 3.0
+package androidx.room {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class CoroutinesRoom {
+ method public static <R> kotlinx.coroutines.flow.Flow<R> createFlow(androidx.room.RoomDatabase db, boolean inTransaction, String![] tableNames, java.util.concurrent.Callable<R> callable);
+ method public static suspend <R> Object! execute(androidx.room.RoomDatabase p, boolean db, java.util.concurrent.Callable<R> inTransaction, kotlin.coroutines.Continuation<? super R> callable);
+ field public static final androidx.room.CoroutinesRoom.Companion! Companion;
+ }
+
+ public static final class CoroutinesRoom.Companion {
+ method public <R> kotlinx.coroutines.flow.Flow<R> createFlow(androidx.room.RoomDatabase db, boolean inTransaction, String![] tableNames, java.util.concurrent.Callable<R> callable);
+ method public suspend <R> Object! execute(androidx.room.RoomDatabase db, boolean inTransaction, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+ public final class CoroutinesRoomKt {
+ ctor public CoroutinesRoomKt();
+ }
+
+ public final class RoomDatabaseKt {
+ ctor public RoomDatabaseKt();
+ method public static suspend <R> Object! withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+}
+
diff --git a/room/migration/api/2.2.0-beta01.txt b/room/migration/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/room/migration/api/2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/room/migration/api/restricted_2.2.0-beta01.txt b/room/migration/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..ae8f58d
--- /dev/null
+++ b/room/migration/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,107 @@
+// Signature format: 3.0
+package androidx.room.migration.bundle {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class BundleUtil {
+ field public static final String TABLE_NAME_PLACEHOLDER = "${TABLE_NAME}";
+ field public static final String VIEW_NAME_PLACEHOLDER = "${VIEW_NAME}";
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseBundle {
+ ctor public DatabaseBundle(int, String!, java.util.List<androidx.room.migration.bundle.EntityBundle!>!, java.util.List<androidx.room.migration.bundle.DatabaseViewBundle!>!, java.util.List<java.lang.String!>!);
+ ctor public DatabaseBundle();
+ method public java.util.List<java.lang.String!>! buildCreateQueries();
+ method public java.util.List<androidx.room.migration.bundle.EntityBundle!>! getEntities();
+ method public java.util.Map<java.lang.String!,androidx.room.migration.bundle.EntityBundle!>! getEntitiesByTableName();
+ method public String! getIdentityHash();
+ method public int getVersion();
+ method public java.util.List<androidx.room.migration.bundle.DatabaseViewBundle!>! getViews();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseBundle!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseViewBundle {
+ ctor public DatabaseViewBundle(String!, String!);
+ method public String! createView();
+ method public String! getCreateSql();
+ method public String! getViewName();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseViewBundle!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class EntityBundle {
+ ctor public EntityBundle(String!, String!, java.util.List<androidx.room.migration.bundle.FieldBundle!>!, androidx.room.migration.bundle.PrimaryKeyBundle!, java.util.List<androidx.room.migration.bundle.IndexBundle!>!, java.util.List<androidx.room.migration.bundle.ForeignKeyBundle!>!);
+ method public java.util.Collection<java.lang.String!>! buildCreateQueries();
+ method public String! createNewTable();
+ method public String! createTable();
+ method public String! getCreateSql();
+ method public java.util.List<androidx.room.migration.bundle.FieldBundle!>! getFields();
+ method public java.util.Map<java.lang.String!,androidx.room.migration.bundle.FieldBundle!>! getFieldsByColumnName();
+ method public java.util.List<androidx.room.migration.bundle.ForeignKeyBundle!>! getForeignKeys();
+ method public java.util.List<androidx.room.migration.bundle.IndexBundle!>! getIndices();
+ method public String! getNewTableName();
+ method public androidx.room.migration.bundle.PrimaryKeyBundle! getPrimaryKey();
+ method public String! getTableName();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.EntityBundle!);
+ method public String renameToOriginal();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
+ ctor @Deprecated public FieldBundle(String!, String!, String!, boolean);
+ ctor public FieldBundle(String!, String!, String!, boolean, String!);
+ method public String! getAffinity();
+ method public String! getColumnName();
+ method public String! getDefaultValue();
+ method public String! getFieldPath();
+ method public boolean isNonNull();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ForeignKeyBundle {
+ ctor public ForeignKeyBundle(String!, String!, String!, java.util.List<java.lang.String!>!, java.util.List<java.lang.String!>!);
+ method public java.util.List<java.lang.String!>! getColumns();
+ method public String! getOnDelete();
+ method public String! getOnUpdate();
+ method public java.util.List<java.lang.String!>! getReferencedColumns();
+ method public String! getTable();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.ForeignKeyBundle!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsEntityBundle extends androidx.room.migration.bundle.EntityBundle {
+ ctor public FtsEntityBundle(String!, String!, java.util.List<androidx.room.migration.bundle.FieldBundle!>!, androidx.room.migration.bundle.PrimaryKeyBundle!, String!, androidx.room.migration.bundle.FtsOptionsBundle!, java.util.List<java.lang.String!>!);
+ method public androidx.room.migration.bundle.FtsOptionsBundle! getFtsOptions();
+ method public java.util.List<java.lang.String!>! getShadowTableNames();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsOptionsBundle {
+ ctor public FtsOptionsBundle(String!, java.util.List<java.lang.String!>!, String!, String!, String!, java.util.List<java.lang.String!>!, java.util.List<java.lang.Integer!>!, String!);
+ method public String! getContentTable();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.FtsOptionsBundle!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class IndexBundle {
+ ctor public IndexBundle(String!, boolean, java.util.List<java.lang.String!>!, String!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! create(String!);
+ method public java.util.List<java.lang.String!>! getColumnNames();
+ method public String! getName();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.IndexBundle!);
+ method public boolean isUnique();
+ field public static final String DEFAULT_PREFIX = "index_";
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PrimaryKeyBundle {
+ ctor public PrimaryKeyBundle(boolean, java.util.List<java.lang.String!>!);
+ method public java.util.List<java.lang.String!>! getColumnNames();
+ method public boolean isAutoGenerate();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.PrimaryKeyBundle!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SchemaBundle {
+ ctor public SchemaBundle(int, androidx.room.migration.bundle.DatabaseBundle!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.room.migration.bundle.SchemaBundle! deserialize(java.io.InputStream!) throws java.io.UnsupportedEncodingException;
+ method public androidx.room.migration.bundle.DatabaseBundle! getDatabase();
+ method public int getFormatVersion();
+ method public boolean isSchemaEqual(androidx.room.migration.bundle.SchemaBundle!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void serialize(androidx.room.migration.bundle.SchemaBundle!, java.io.File!) throws java.io.IOException;
+ field public static final int LATEST_FORMAT = 1; // 0x1
+ }
+
+}
+
diff --git a/room/runtime/api/2.2.0-beta01.txt b/room/runtime/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..1d210e5
--- /dev/null
+++ b/room/runtime/api/2.2.0-beta01.txt
@@ -0,0 +1,117 @@
+// Signature format: 3.0
+package androidx.room {
+
+ public class DatabaseConfiguration {
+ method public boolean isMigrationRequired(int, int);
+ method @Deprecated public boolean isMigrationRequiredFrom(int);
+ field public final boolean allowDestructiveMigrationOnDowngrade;
+ field public final boolean allowMainThreadQueries;
+ field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
+ field public final android.content.Context context;
+ field public final String? copyFromAssetPath;
+ field public final java.io.File? copyFromFile;
+ field public final androidx.room.RoomDatabase.JournalMode! journalMode;
+ field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+ field public final boolean multiInstanceInvalidation;
+ field public final String? name;
+ field public final java.util.concurrent.Executor queryExecutor;
+ field public final boolean requireMigration;
+ field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+ field public final java.util.concurrent.Executor transactionExecutor;
+ }
+
+ public class InvalidationTracker {
+ method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer);
+ method public void refreshVersionsAsync();
+ method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer);
+ }
+
+ public abstract static class InvalidationTracker.Observer {
+ ctor protected InvalidationTracker.Observer(String, java.lang.String!...);
+ ctor public InvalidationTracker.Observer(String![]);
+ method public abstract void onInvalidated(java.util.Set<java.lang.String!>);
+ }
+
+ public class Room {
+ ctor @Deprecated public Room();
+ method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> databaseBuilder(android.content.Context, Class<T!>, String);
+ method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> inMemoryDatabaseBuilder(android.content.Context, Class<T!>);
+ field public static final String MASTER_TABLE_NAME = "room_master_table";
+ }
+
+ public abstract class RoomDatabase {
+ ctor public RoomDatabase();
+ method @Deprecated public void beginTransaction();
+ method @WorkerThread public abstract void clearAllTables();
+ method public void close();
+ method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String);
+ method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+ method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration!);
+ method @Deprecated public void endTransaction();
+ method public androidx.room.InvalidationTracker getInvalidationTracker();
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+ method public java.util.concurrent.Executor getQueryExecutor();
+ method public java.util.concurrent.Executor getTransactionExecutor();
+ method public boolean inTransaction();
+ method @CallSuper public void init(androidx.room.DatabaseConfiguration);
+ method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase);
+ method public boolean isOpen();
+ method public android.database.Cursor query(String, Object![]?);
+ method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery);
+ method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery, android.os.CancellationSignal?);
+ method public void runInTransaction(Runnable);
+ method public <V> V! runInTransaction(java.util.concurrent.Callable<V!>);
+ method @Deprecated public void setTransactionSuccessful();
+ field @Deprecated protected java.util.List<androidx.room.RoomDatabase.Callback!>? mCallbacks;
+ field @Deprecated protected volatile androidx.sqlite.db.SupportSQLiteDatabase! mDatabase;
+ }
+
+ public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+ method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
+ method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
+ method public androidx.room.RoomDatabase.Builder<T!> allowMainThreadQueries();
+ method public T build();
+ method public androidx.room.RoomDatabase.Builder<T!> createFromAsset(String);
+ method public androidx.room.RoomDatabase.Builder<T!> createFromFile(java.io.File);
+ method public androidx.room.RoomDatabase.Builder<T!> enableMultiInstanceInvalidation();
+ method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigration();
+ method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationFrom(int...);
+ method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationOnDowngrade();
+ method public androidx.room.RoomDatabase.Builder<T!> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory?);
+ method public androidx.room.RoomDatabase.Builder<T!> setJournalMode(androidx.room.RoomDatabase.JournalMode);
+ method public androidx.room.RoomDatabase.Builder<T!> setQueryExecutor(java.util.concurrent.Executor);
+ method public androidx.room.RoomDatabase.Builder<T!> setTransactionExecutor(java.util.concurrent.Executor);
+ }
+
+ public abstract static class RoomDatabase.Callback {
+ ctor public RoomDatabase.Callback();
+ method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase);
+ method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase);
+ method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase);
+ }
+
+ public enum RoomDatabase.JournalMode {
+ enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+ enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.JELLY_BEAN) public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+ }
+
+ public static class RoomDatabase.MigrationContainer {
+ ctor public RoomDatabase.MigrationContainer();
+ method public void addMigrations(androidx.room.migration.Migration!...);
+ method public java.util.List<androidx.room.migration.Migration!>? findMigrationPath(int, int);
+ }
+
+}
+
+package androidx.room.migration {
+
+ public abstract class Migration {
+ ctor public Migration(int, int);
+ method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+ field public final int endVersion;
+ field public final int startVersion;
+ }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/runtime/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/runtime/api/res-2.2.0-beta01.txt
diff --git a/room/runtime/api/restricted_2.2.0-beta01.ignore b/room/runtime/api/restricted_2.2.0-beta01.ignore
new file mode 100644
index 0000000..6984c60
--- /dev/null
+++ b/room/runtime/api/restricted_2.2.0-beta01.ignore
@@ -0,0 +1,19 @@
+// Baseline format: 1.0
+ChangedType: androidx.room.InvalidationTracker#createLiveData(String[], boolean, java.util.concurrent.Callable<T>):
+ Method androidx.room.InvalidationTracker.createLiveData has changed return type from LiveData<T> to androidx.lifecycle.LiveData<T>
+ChangedType: androidx.room.InvalidationTracker#createLiveData(String[], java.util.concurrent.Callable<T>):
+ Method androidx.room.InvalidationTracker.createLiveData has changed return type from LiveData<T> to androidx.lifecycle.LiveData<T>
+
+
+InvalidNullConversion: androidx.room.InvalidationTracker#createLiveData(String[], boolean, java.util.concurrent.Callable<T>):
+ Attempted to remove @NonNull annotation from method androidx.room.InvalidationTracker.createLiveData(String[],boolean,java.util.concurrent.Callable<T>)
+InvalidNullConversion: androidx.room.InvalidationTracker#createLiveData(String[], java.util.concurrent.Callable<T>):
+ Attempted to remove @NonNull annotation from method androidx.room.InvalidationTracker.createLiveData(String[],java.util.concurrent.Callable<T>)
+
+
+RemovedMethod: androidx.room.paging.LimitOffsetDataSource#isInvalid():
+ Removed method androidx.room.paging.LimitOffsetDataSource.isInvalid()
+RemovedMethod: androidx.room.paging.LimitOffsetDataSource#loadInitial(LoadInitialParams, LoadInitialCallback<T>):
+ Removed method androidx.room.paging.LimitOffsetDataSource.loadInitial(LoadInitialParams,LoadInitialCallback<T>)
+RemovedMethod: androidx.room.paging.LimitOffsetDataSource#loadRange(LoadRangeParams, LoadRangeCallback<T>):
+ Removed method androidx.room.paging.LimitOffsetDataSource.loadRange(LoadRangeParams,LoadRangeCallback<T>)
diff --git a/room/runtime/api/restricted_2.2.0-beta01.txt b/room/runtime/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..6bc1371
--- /dev/null
+++ b/room/runtime/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,318 @@
+// Signature format: 3.0
+package androidx.room {
+
+ public class DatabaseConfiguration {
+ ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, boolean, java.util.Set<java.lang.Integer!>?);
+ ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?);
+ method public boolean isMigrationRequired(int, int);
+ method @Deprecated public boolean isMigrationRequiredFrom(int);
+ field public final boolean allowDestructiveMigrationOnDowngrade;
+ field public final boolean allowMainThreadQueries;
+ field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
+ field public final android.content.Context context;
+ field public final String? copyFromAssetPath;
+ field public final java.io.File? copyFromFile;
+ field public final androidx.room.RoomDatabase.JournalMode! journalMode;
+ field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+ field public final boolean multiInstanceInvalidation;
+ field public final String? name;
+ field public final java.util.concurrent.Executor queryExecutor;
+ field public final boolean requireMigration;
+ field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+ field public final java.util.concurrent.Executor transactionExecutor;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class EntityDeletionOrUpdateAdapter<T> extends androidx.room.SharedSQLiteStatement {
+ ctor public EntityDeletionOrUpdateAdapter(androidx.room.RoomDatabase!);
+ method protected abstract void bind(androidx.sqlite.db.SupportSQLiteStatement!, T!);
+ method public final int handle(T!);
+ method public final int handleMultiple(Iterable<? extends T>!);
+ method public final int handleMultiple(T![]!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class EntityInsertionAdapter<T> extends androidx.room.SharedSQLiteStatement {
+ ctor public EntityInsertionAdapter(androidx.room.RoomDatabase!);
+ method protected abstract void bind(androidx.sqlite.db.SupportSQLiteStatement!, T!);
+ method public final void insert(T!);
+ method public final void insert(T![]!);
+ method public final void insert(Iterable<? extends T>!);
+ method public final long insertAndReturnId(T!);
+ method public final long[]! insertAndReturnIdsArray(java.util.Collection<? extends T>!);
+ method public final long[]! insertAndReturnIdsArray(T![]!);
+ method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<? extends T>!);
+ method public final Long![]! insertAndReturnIdsArrayBox(T![]!);
+ method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(T![]!);
+ method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<? extends T>!);
+ }
+
+ public class InvalidationTracker {
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase!, java.lang.String!...);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase!, java.util.Map<java.lang.String!,java.lang.String!>!, java.util.Map<java.lang.String!,java.util.Set<java.lang.String!>!>!, java.lang.String!...);
+ method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addWeakObserver(androidx.room.InvalidationTracker.Observer!);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T> androidx.lifecycle.LiveData<T!>! createLiveData(String![]!, java.util.concurrent.Callable<T!>!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T> androidx.lifecycle.LiveData<T!>! createLiveData(String![]!, boolean, java.util.concurrent.Callable<T!>!);
+ method public void refreshVersionsAsync();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @WorkerThread public void refreshVersionsSync();
+ method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer);
+ }
+
+ public abstract static class InvalidationTracker.Observer {
+ ctor protected InvalidationTracker.Observer(String, java.lang.String!...);
+ ctor public InvalidationTracker.Observer(String![]);
+ method public abstract void onInvalidated(java.util.Set<java.lang.String!>);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MultiInstanceInvalidationService extends android.app.Service {
+ ctor public MultiInstanceInvalidationService();
+ method public android.os.IBinder? onBind(android.content.Intent!);
+ }
+
+ public class Room {
+ ctor @Deprecated public Room();
+ method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> databaseBuilder(android.content.Context, Class<T!>, String);
+ method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> inMemoryDatabaseBuilder(android.content.Context, Class<T!>);
+ field public static final String MASTER_TABLE_NAME = "room_master_table";
+ }
+
+ public abstract class RoomDatabase {
+ ctor public RoomDatabase();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void assertNotMainThread();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void assertNotSuspendingTransaction();
+ method @Deprecated public void beginTransaction();
+ method @WorkerThread public abstract void clearAllTables();
+ method public void close();
+ method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String);
+ method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+ method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration!);
+ method @Deprecated public void endTransaction();
+ method public androidx.room.InvalidationTracker getInvalidationTracker();
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+ method public java.util.concurrent.Executor getQueryExecutor();
+ method public java.util.concurrent.Executor getTransactionExecutor();
+ method public boolean inTransaction();
+ method @CallSuper public void init(androidx.room.DatabaseConfiguration);
+ method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase);
+ method public boolean isOpen();
+ method public android.database.Cursor query(String, Object![]?);
+ method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery);
+ method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery, android.os.CancellationSignal?);
+ method public void runInTransaction(Runnable);
+ method public <V> V! runInTransaction(java.util.concurrent.Callable<V!>);
+ method @Deprecated public void setTransactionSuccessful();
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int MAX_BIND_PARAMETER_CNT = 999; // 0x3e7
+ field @Deprecated protected java.util.List<androidx.room.RoomDatabase.Callback!>? mCallbacks;
+ field @Deprecated protected volatile androidx.sqlite.db.SupportSQLiteDatabase! mDatabase;
+ }
+
+ public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+ method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
+ method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
+ method public androidx.room.RoomDatabase.Builder<T!> allowMainThreadQueries();
+ method public T build();
+ method public androidx.room.RoomDatabase.Builder<T!> createFromAsset(String);
+ method public androidx.room.RoomDatabase.Builder<T!> createFromFile(java.io.File);
+ method public androidx.room.RoomDatabase.Builder<T!> enableMultiInstanceInvalidation();
+ method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigration();
+ method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationFrom(int...);
+ method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationOnDowngrade();
+ method public androidx.room.RoomDatabase.Builder<T!> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory?);
+ method public androidx.room.RoomDatabase.Builder<T!> setJournalMode(androidx.room.RoomDatabase.JournalMode);
+ method public androidx.room.RoomDatabase.Builder<T!> setQueryExecutor(java.util.concurrent.Executor);
+ method public androidx.room.RoomDatabase.Builder<T!> setTransactionExecutor(java.util.concurrent.Executor);
+ }
+
+ public abstract static class RoomDatabase.Callback {
+ ctor public RoomDatabase.Callback();
+ method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase);
+ method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase);
+ method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase);
+ }
+
+ public enum RoomDatabase.JournalMode {
+ enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+ enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.JELLY_BEAN) public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+ }
+
+ public static class RoomDatabase.MigrationContainer {
+ ctor public RoomDatabase.MigrationContainer();
+ method public void addMigrations(androidx.room.migration.Migration!...);
+ method public java.util.List<androidx.room.migration.Migration!>? findMigrationPath(int, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomOpenHelper extends androidx.sqlite.db.SupportSQLiteOpenHelper.Callback {
+ ctor public RoomOpenHelper(androidx.room.DatabaseConfiguration, androidx.room.RoomOpenHelper.Delegate, String, String);
+ ctor public RoomOpenHelper(androidx.room.DatabaseConfiguration, androidx.room.RoomOpenHelper.Delegate, String);
+ method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract static class RoomOpenHelper.Delegate {
+ ctor public RoomOpenHelper.Delegate(int);
+ method protected abstract void createAllTables(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method protected abstract void dropAllTables(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method protected abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method protected abstract void onOpen(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method protected void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method protected void onPreMigrate(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method protected androidx.room.RoomOpenHelper.ValidationResult onValidateSchema(androidx.sqlite.db.SupportSQLiteDatabase);
+ method @Deprecated protected void validateMigration(androidx.sqlite.db.SupportSQLiteDatabase!);
+ field public final int version;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class RoomOpenHelper.ValidationResult {
+ ctor public RoomOpenHelper.ValidationResult(boolean, String?);
+ field public final String? expectedFoundMsg;
+ field public final boolean isValid;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomSQLiteQuery implements androidx.sqlite.db.SupportSQLiteProgram androidx.sqlite.db.SupportSQLiteQuery {
+ method public static androidx.room.RoomSQLiteQuery! acquire(String!, int);
+ method public void bindBlob(int, byte[]!);
+ method public void bindDouble(int, double);
+ method public void bindLong(int, long);
+ method public void bindNull(int);
+ method public void bindString(int, String!);
+ method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+ method public void clearBindings();
+ method public void close();
+ method public void copyArgumentsFrom(androidx.room.RoomSQLiteQuery!);
+ method public static androidx.room.RoomSQLiteQuery! copyFrom(androidx.sqlite.db.SupportSQLiteQuery!);
+ method public int getArgCount();
+ method public String! getSql();
+ method public void release();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class SharedSQLiteStatement {
+ ctor public SharedSQLiteStatement(androidx.room.RoomDatabase!);
+ method public androidx.sqlite.db.SupportSQLiteStatement! acquire();
+ method protected void assertNotMainThread();
+ method protected abstract String! createQuery();
+ method public void release(androidx.sqlite.db.SupportSQLiteStatement!);
+ }
+
+}
+
+package androidx.room.migration {
+
+ public abstract class Migration {
+ ctor public Migration(int, int);
+ method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+ field public final int endVersion;
+ field public final int startVersion;
+ }
+
+}
+
+package androidx.room.paging {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class LimitOffsetDataSource<T> extends androidx.paging.PositionalDataSource<T> {
+ ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase!, androidx.sqlite.db.SupportSQLiteQuery!, boolean, java.lang.String!...);
+ ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase!, androidx.room.RoomSQLiteQuery!, boolean, java.lang.String!...);
+ method protected abstract java.util.List<T!>! convertRows(android.database.Cursor!);
+ method public void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams, androidx.paging.PositionalDataSource.LoadInitialCallback<T!>);
+ method public void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams, androidx.paging.PositionalDataSource.LoadRangeCallback<T!>);
+ }
+
+}
+
+package androidx.room.util {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CopyLock {
+ ctor public CopyLock(String, java.io.File, boolean);
+ method public void lock();
+ method public void unlock();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CursorUtil {
+ method public static android.database.Cursor copyAndClose(android.database.Cursor);
+ method public static int getColumnIndex(android.database.Cursor, String);
+ method public static int getColumnIndexOrThrow(android.database.Cursor, String);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DBUtil {
+ method public static android.os.CancellationSignal? createCancellationSignal();
+ method public static void dropFtsSyncTriggers(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method @Deprecated public static android.database.Cursor query(androidx.room.RoomDatabase!, androidx.sqlite.db.SupportSQLiteQuery!, boolean);
+ method public static android.database.Cursor query(androidx.room.RoomDatabase, androidx.sqlite.db.SupportSQLiteQuery, boolean, android.os.CancellationSignal?);
+ method public static int readVersion(java.io.File) throws java.io.IOException;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FileUtil {
+ method public static void copy(java.nio.channels.ReadableByteChannel, java.nio.channels.FileChannel) throws java.io.IOException;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsTableInfo {
+ ctor public FtsTableInfo(String!, java.util.Set<java.lang.String!>!, java.util.Set<java.lang.String!>!);
+ ctor public FtsTableInfo(String!, java.util.Set<java.lang.String!>!, String!);
+ method public static androidx.room.util.FtsTableInfo! read(androidx.sqlite.db.SupportSQLiteDatabase!, String!);
+ field public final java.util.Set<java.lang.String!>! columns;
+ field public final String! name;
+ field public final java.util.Set<java.lang.String!>! options;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class SneakyThrow {
+ method public static void reThrow(Exception);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StringUtil {
+ method public static void appendPlaceholders(StringBuilder!, int);
+ method public static String? joinIntoString(java.util.List<java.lang.Integer!>?);
+ method public static StringBuilder! newStringBuilder();
+ method public static java.util.List<java.lang.Integer!>? splitToIntList(String?);
+ field public static final String![]! EMPTY_STRING_ARRAY;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TableInfo {
+ ctor public TableInfo(String!, java.util.Map<java.lang.String!,androidx.room.util.TableInfo.Column!>!, java.util.Set<androidx.room.util.TableInfo.ForeignKey!>!, java.util.Set<androidx.room.util.TableInfo.Index!>!);
+ ctor public TableInfo(String!, java.util.Map<java.lang.String!,androidx.room.util.TableInfo.Column!>!, java.util.Set<androidx.room.util.TableInfo.ForeignKey!>!);
+ method public static androidx.room.util.TableInfo! read(androidx.sqlite.db.SupportSQLiteDatabase!, String!);
+ field public static final int CREATED_FROM_DATABASE = 2; // 0x2
+ field public static final int CREATED_FROM_ENTITY = 1; // 0x1
+ field public static final int CREATED_FROM_UNKNOWN = 0; // 0x0
+ field public final java.util.Map<java.lang.String!,androidx.room.util.TableInfo.Column!>! columns;
+ field public final java.util.Set<androidx.room.util.TableInfo.ForeignKey!>! foreignKeys;
+ field public final java.util.Set<androidx.room.util.TableInfo.Index!>? indices;
+ field public final String! name;
+ }
+
+ public static class TableInfo.Column {
+ ctor @Deprecated public TableInfo.Column(String!, String!, boolean, int);
+ ctor public TableInfo.Column(String!, String!, boolean, int, String!, int);
+ method public boolean isPrimaryKey();
+ field public final int affinity;
+ field public final String! defaultValue;
+ field public final String! name;
+ field public final boolean notNull;
+ field public final int primaryKeyPosition;
+ field public final String! type;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class TableInfo.ForeignKey {
+ ctor public TableInfo.ForeignKey(String, String, String, java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+ field public final java.util.List<java.lang.String!> columnNames;
+ field public final String onDelete;
+ field public final String onUpdate;
+ field public final java.util.List<java.lang.String!> referenceColumnNames;
+ field public final String referenceTable;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class TableInfo.Index {
+ ctor public TableInfo.Index(String!, boolean, java.util.List<java.lang.String!>!);
+ field public static final String DEFAULT_PREFIX = "index_";
+ field public final java.util.List<java.lang.String!>! columns;
+ field public final String! name;
+ field public final boolean unique;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewInfo {
+ ctor public ViewInfo(String!, String!);
+ method public static androidx.room.util.ViewInfo! read(androidx.sqlite.db.SupportSQLiteDatabase!, String!);
+ field public final String! name;
+ field public final String! sql;
+ }
+
+}
+
diff --git a/room/rxjava2/api/2.2.0-beta01.txt b/room/rxjava2/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..07ab5f2
--- /dev/null
+++ b/room/rxjava2/api/2.2.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 3.0
+package androidx.room {
+
+ public class EmptyResultSetException extends java.lang.RuntimeException {
+ ctor public EmptyResultSetException(String!);
+ }
+
+ public class RxRoom {
+ ctor @Deprecated public RxRoom();
+ method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+ method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+ field public static final Object! NOTHING;
+ }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/rxjava2/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/rxjava2/api/res-2.2.0-beta01.txt
diff --git a/room/rxjava2/api/restricted_2.2.0-beta01.txt b/room/rxjava2/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..869770f
--- /dev/null
+++ b/room/rxjava2/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.room {
+
+ public class EmptyResultSetException extends java.lang.RuntimeException {
+ ctor public EmptyResultSetException(String!);
+ }
+
+ public class RxRoom {
+ ctor @Deprecated public RxRoom();
+ method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Flowable<T!>! createFlowable(androidx.room.RoomDatabase!, String![]!, java.util.concurrent.Callable<T!>!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Flowable<T!>! createFlowable(androidx.room.RoomDatabase!, boolean, String![]!, java.util.concurrent.Callable<T!>!);
+ method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Observable<T!>! createObservable(androidx.room.RoomDatabase!, String![]!, java.util.concurrent.Callable<T!>!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Observable<T!>! createObservable(androidx.room.RoomDatabase!, boolean, String![]!, java.util.concurrent.Callable<T!>!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Single<T!>! createSingle(java.util.concurrent.Callable<T!>!);
+ field public static final Object! NOTHING;
+ }
+
+}
+
diff --git a/room/testing/api/2.2.0-beta01.txt b/room/testing/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..86e22e8
--- /dev/null
+++ b/room/testing/api/2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room.testing {
+
+ public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+ ctor public MigrationTestHelper(android.app.Instrumentation!, String!);
+ ctor public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+ method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void closeWhenFinished(androidx.room.RoomDatabase!);
+ method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+ method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+ }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/testing/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/testing/api/res-2.2.0-beta01.txt
diff --git a/room/testing/api/restricted_2.2.0-beta01.txt b/room/testing/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..86e22e8
--- /dev/null
+++ b/room/testing/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room.testing {
+
+ public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+ ctor public MigrationTestHelper(android.app.Instrumentation!, String!);
+ ctor public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+ method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void closeWhenFinished(androidx.room.RoomDatabase!);
+ method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+ method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+ }
+
+}
+
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java
index dbddf77..a73d222 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java
@@ -47,33 +47,30 @@
hostInFragmentButton.setOnClickListener(view -> launchFragmentHost());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
biometricBoundKeyDemoButton.setOnClickListener(view -> launchBiometricBoundKeyDemo());
- } else {
- biometricBoundKeyDemoButton.setVisibility(View.GONE);
- }
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
credentialBoundKeyDemoButton.setOnClickListener(view -> launchCredentialBoundKeyDemo());
} else {
+ biometricBoundKeyDemoButton.setVisibility(View.GONE);
credentialBoundKeyDemoButton.setVisibility(View.GONE);
}
}
private void launchActivityHost() {
- Intent intent = new Intent(this, BiometricPromptDemoActivityHost.class);
+ final Intent intent = new Intent(this, BiometricPromptDemoActivityHost.class);
startActivity(intent);
}
private void launchFragmentHost() {
- Intent intent = new Intent(this, BiometricPromptDemoFragmentHostActivity.class);
+ final Intent intent = new Intent(this, BiometricPromptDemoFragmentHostActivity.class);
startActivity(intent);
}
private void launchBiometricBoundKeyDemo() {
- Intent intent = new Intent(this, BiometricPromptDemoBiometricBoundKeyActivity.class);
+ final Intent intent = new Intent(this, BiometricPromptDemoBiometricBoundKeyActivity.class);
startActivity(intent);
}
private void launchCredentialBoundKeyDemo() {
- Intent intent = new Intent(this, BiometricPromptDemoCredentialBoundKeyActivity.class);
+ final Intent intent = new Intent(this, BiometricPromptDemoCredentialBoundKeyActivity.class);
startActivity(intent);
}
}
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
index f14163a..ae47efb 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
@@ -17,7 +17,6 @@
package com.example.android.biometric;
import android.content.Context;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -162,12 +161,6 @@
}
log("canAuthenticate: " + message);
});
-
-
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
- mAllowDeviceCredentialCheckbox.setEnabled(false);
- mAllowDeviceCredentialCheckbox.setChecked(false);
- }
}
void onPause() {
@@ -196,8 +189,7 @@
+ mCounter)
.setConfirmationRequired(mRequireConfirmationCheckbox.isChecked());
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
- && mAllowDeviceCredentialCheckbox.isChecked()) {
+ if (mAllowDeviceCredentialCheckbox.isChecked()) {
builder.setDeviceCredentialAllowed(true);
} else {
builder.setNegativeButtonText("Negative Button " + mCounter);
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java
index 6e4dd92..b475450 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java
@@ -25,6 +25,7 @@
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.biometric.BiometricPrompt;
import androidx.fragment.app.FragmentActivity;
@@ -50,7 +51,7 @@
/**
* Demo activity that shows how BiometricPrompt can be used with credential bound secret keys.
*/
-@RequiresApi(api = Build.VERSION_CODES.Q)
+@RequiresApi(api = Build.VERSION_CODES.M)
public class BiometricPromptDemoCredentialBoundKeyActivity extends FragmentActivity {
private static final String TAG = "bio_prompt_demo_control";
@@ -150,7 +151,7 @@
};
@Override
- protected void onCreate(Bundle savedInstanceState) {
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.biometric_prompt_demo_credential_bound_key);
diff --git a/sharetarget/build.gradle b/sharetarget/build.gradle
index b750a70..cc27624 100644
--- a/sharetarget/build.gradle
+++ b/sharetarget/build.gradle
@@ -25,7 +25,7 @@
}
dependencies {
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
implementation("androidx.collection:collection:1.0.0")
api(GUAVA_LISTENABLE_FUTURE)
implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha02")
diff --git a/sharetarget/integration-tests/testapp/build.gradle b/sharetarget/integration-tests/testapp/build.gradle
index 4cf7a1f..fd2075d 100644
--- a/sharetarget/integration-tests/testapp/build.gradle
+++ b/sharetarget/integration-tests/testapp/build.gradle
@@ -22,8 +22,8 @@
}
dependencies {
- api(project(":core:core"))
- api(project(":sharetarget"))
+ api("androidx.core:core:1.1.0")
+ api("androidx.sharetarget:sharetarget:1.0.0-alpha02")
api(project(":appcompat"))
api(CONSTRAINT_LAYOUT, { transitive = true })
}
diff --git a/slices/builders/build.gradle b/slices/builders/build.gradle
index 914633c..63bbe8d 100644
--- a/slices/builders/build.gradle
+++ b/slices/builders/build.gradle
@@ -28,7 +28,7 @@
implementation(project(":slice-core"))
api(project(":remotecallback"))
implementation "androidx.annotation:annotation:1.1.0"
- implementation "androidx.core:core:1.1.0-rc01"
+ implementation "androidx.core:core:1.1.0"
implementation project(':collection:collection')
}
diff --git a/slices/core/api/1.1.0-alpha02.txt b/slices/core/api/1.1.0-alpha02.txt
index bada082..728a150 100644
--- a/slices/core/api/1.1.0-alpha02.txt
+++ b/slices/core/api/1.1.0-alpha02.txt
@@ -64,7 +64,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_PREFIX) 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 bada082..728a150 100644
--- a/slices/core/api/current.txt
+++ b/slices/core/api/current.txt
@@ -64,7 +64,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_PREFIX) 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/restricted_1.1.0-alpha02.txt b/slices/core/api/restricted_1.1.0-alpha02.txt
index 3cf1dca..878a544 100644
--- a/slices/core/api/restricted_1.1.0-alpha02.txt
+++ b/slices/core/api/restricted_1.1.0-alpha02.txt
@@ -126,7 +126,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_PREFIX) 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?);
}
@RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SliceSpec implements androidx.versionedparcelable.VersionedParcelable {
diff --git a/slices/core/api/restricted_current.txt b/slices/core/api/restricted_current.txt
index 3cf1dca..878a544 100644
--- a/slices/core/api/restricted_current.txt
+++ b/slices/core/api/restricted_current.txt
@@ -126,7 +126,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_PREFIX) 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?);
}
@RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SliceSpec implements androidx.versionedparcelable.VersionedParcelable {
diff --git a/slices/core/src/main/java/androidx/slice/SliceProvider.java b/slices/core/src/main/java/androidx/slice/SliceProvider.java
index a4b57aa..6164547 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProvider.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProvider.java
@@ -235,6 +235,7 @@
@Override
public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
if (Build.VERSION.SDK_INT < 19) return null;
+ if (extras == null) return null;
return mCompat != null ? mCompat.call(method, arg, extras) : null;
}
diff --git a/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java b/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
index 5404f79..fffb2d2 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
@@ -59,6 +59,7 @@
@Nullable
@Override
public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
+ if (extras == null) return null;
if (ProviderRelayReceiver.METHOD_PROVIDER_CALLBACK.equals(method)) {
CallbackHandlerRegistry.sInstance.invokeCallback(getContext(), this, extras);
return null;
@@ -81,7 +82,7 @@
@Override
@RestrictTo(LIBRARY_GROUP_PREFIX)
public RemoteCallback toRemoteCallback(@NonNull Class<T> cls, @NonNull Context context,
- @Nullable String authority, @NonNull Bundle args, @Nullable String method) {
+ @NonNull String authority, @NonNull Bundle args, @Nullable String method) {
if (authority == null) {
throw new IllegalStateException(
"ContentProvider must be attached before creating callbacks");
diff --git a/slidingpanelayout/build.gradle b/slidingpanelayout/build.gradle
index b9732d5..7738665 100644
--- a/slidingpanelayout/build.gradle
+++ b/slidingpanelayout/build.gradle
@@ -9,7 +9,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
api(project(":customview"))
}
diff --git a/sqlite/OWNERS b/sqlite/OWNERS
index fc51372..edfaa80 100644
--- a/sqlite/OWNERS
+++ b/sqlite/OWNERS
@@ -1,2 +1,3 @@
sergeyv@google.com
-yboyar@google.com
\ No newline at end of file
+yboyar@google.com
+danysantiago@google.com
\ No newline at end of file
diff --git a/swiperefreshlayout/OWNERS b/swiperefreshlayout/OWNERS
new file mode 100644
index 0000000..f92940c
--- /dev/null
+++ b/swiperefreshlayout/OWNERS
@@ -0,0 +1 @@
+shepshapard@google.com
\ No newline at end of file
diff --git a/swiperefreshlayout/build.gradle b/swiperefreshlayout/build.gradle
index 1309851..46c3da4 100644
--- a/swiperefreshlayout/build.gradle
+++ b/swiperefreshlayout/build.gradle
@@ -10,7 +10,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
api("androidx.interpolator:interpolator:1.0.0")
androidTestImplementation(JUNIT)
diff --git a/textclassifier/build.gradle b/textclassifier/build.gradle
index d2cd121..92508eb 100644
--- a/textclassifier/build.gradle
+++ b/textclassifier/build.gradle
@@ -13,7 +13,7 @@
api("androidx.annotation:annotation:1.1.0")
implementation("androidx.collection:collection:1.0.0")
// TODO: change to 1.1.0-alpha04 after release
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index b4cbc11..902b0d5 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -10,7 +10,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
index 2f7e1c3..4f790c7 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
@@ -21,6 +21,8 @@
import androidx.ui.core.TestTag
import androidx.ui.core.Text
import androidx.ui.layout.Center
+import androidx.ui.test.assertHasClickAction
+import androidx.ui.test.assertHasNoClickAction
import androidx.ui.test.assertSemanticsIsEqualTo
import androidx.ui.test.createComposeRule
import androidx.ui.test.createFullSemantics
@@ -57,6 +59,7 @@
isEnabled = true
)
)
+ .assertHasClickAction()
}
@Test
@@ -77,6 +80,7 @@
isEnabled = false
)
)
+ .assertHasNoClickAction()
}
@Test
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
index 66473034..fabf791 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
@@ -29,7 +29,7 @@
*
* @sample androidx.ui.foundation.samples.ClickableSample
*
- * @param onClick will be called when user clicked on the button. The button will not be
+ * @param onClick will be called when user clicked on the button. The children will not be
* clickable when it is null.
* @param consumeDownOnStart true means [PressReleasedGestureDetector] should consume
* down events. Provide false if you have some visual feedback like Ripples,
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt
index 4ce2cf1..bf850804 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt
@@ -205,7 +205,7 @@
accessibilityLabel = text.text
}
) {
- val textPainter = +memo(
+ val textDelegate = +memo(
text,
mergedStyle,
paragraphStyle,
@@ -232,17 +232,17 @@
OnPositioned(onPositioned = { layoutCoordinates.value = it })
Draw { canvas, _ ->
internalSelection.value?.let {
- textPainter.paintBackground(
+ textDelegate.paintBackground(
it.start, it.end, selectionColor, canvas
)
}
- textPainter.paint(canvas)
+ textDelegate.paint(canvas)
}
}
ComplexLayout(children) {
measure { _, constraints ->
- textPainter.layout(constraints)
- layout(textPainter.width.px.round(), textPainter.height.px.round()) {}
+ textDelegate.layout(constraints)
+ layout(textDelegate.width.px.round(), textDelegate.height.px.round()) {}
}
minIntrinsicWidth { _, _ ->
// TODO(popam): discuss with the Text team about this
@@ -251,16 +251,16 @@
// textDelegate.minIntrinsicWidth.px.round()
}
minIntrinsicHeight { _, w ->
- textPainter.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
- textPainter.height.px.round()
+ textDelegate.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
+ textDelegate.height.px.round()
}
maxIntrinsicWidth { _, h ->
- textPainter.layout(Constraints(0.ipx, IntPx.Infinity, 0.ipx, h))
- textPainter.maxIntrinsicWidth.px.round()
+ textDelegate.layout(Constraints(0.ipx, IntPx.Infinity, 0.ipx, h))
+ textDelegate.maxIntrinsicWidth.px.round()
}
maxIntrinsicHeight { _, w ->
- textPainter.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
- textPainter.height.px.round()
+ textDelegate.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
+ textDelegate.height.px.round()
}
}
@@ -290,7 +290,7 @@
selectionCoordinates = Pair(startPx, endPx),
mode = mode,
onSelectionChange = { internalSelection.value = it },
- textDelegate = textPainter
+ textDelegate = textDelegate
)
if (!textSelectionProcessor.isSelected) return null
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt b/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
index 9dfb3d3..cf28b6e 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
@@ -100,7 +100,7 @@
val (visualText, offsetMap) = +memo(value, visualTransformation) {
TextFieldDelegate.applyVisualFilter(value, visualTransformation)
}
- val textPainter = +memo(visualText, mergedStyle, density, resourceLoader) {
+ val textDelegate = +memo(visualText, mergedStyle, density, resourceLoader) {
// TODO(nona): Add parameter for text direction, softwrap, etc.
TextDelegate(
text = visualText,
@@ -131,7 +131,7 @@
textInputService?.let { textInputService ->
TextFieldDelegate.notifyFocusedRect(
value,
- textPainter,
+ textDelegate,
coords,
textInputService,
hasFocus.value,
@@ -153,7 +153,7 @@
onRelease = {
TextFieldDelegate.onRelease(
it,
- textPainter,
+ textDelegate,
processor,
offsetMap,
onValueChange,
@@ -170,7 +170,7 @@
coords.value = it
TextFieldDelegate.notifyFocusedRect(
value,
- textPainter,
+ textDelegate,
it,
textInputService,
hasFocus.value,
@@ -182,12 +182,12 @@
canvas,
value,
offsetMap,
- textPainter,
+ textDelegate,
hasFocus.value,
editorStyle) }
},
measureBlock = { _, constraints ->
- TextFieldDelegate.layout(textPainter, constraints).let {
+ TextFieldDelegate.layout(textDelegate, constraints).let {
layout(it.first, it.second) {}
}
}
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt b/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
index 1d61351..bd7108d 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
@@ -88,7 +88,7 @@
// We anyway need to compute layout for preventing NPE during draw which require layout
// result.
// TODO(nona): Fix this?
- textDelegate.layout(constraints)
+ textDelegate.layout(Constraints.tightConstraintsForWidth(constraints.maxWidth))
val isEmptyText = textDelegate.text.text.isEmpty()
val height = if (isEmptyText) {
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
index 085a83f..179d4c5 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
@@ -362,7 +362,10 @@
assertEquals(1024.px.round(), res.first)
assertEquals(512.px.round(), res.second)
- verify(mDelegate, times(1)).layout(constraints)
+ val captor = argumentCaptor<Constraints>()
+ verify(mDelegate, times(1)).layout(captor.capture())
+ assertEquals(1024.ipx, captor.firstValue.minWidth)
+ assertEquals(1024.ipx, captor.firstValue.maxWidth)
}
@Test
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt
index 376e7d8..2572b53 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt
@@ -29,6 +29,7 @@
import androidx.ui.foundation.semantics.toggleableState
import androidx.ui.layout.Column
import androidx.ui.semantics.accessibilityValue
+import androidx.ui.test.assertHasNoClickAction
import androidx.ui.test.assertIsChecked
import androidx.ui.test.assertIsUnchecked
import androidx.ui.test.assertSemanticsIsEqualTo
@@ -126,9 +127,7 @@
}
findByTag(defaultTag)
- .assertIsUnchecked()
- .doClick()
- .assertIsUnchecked()
+ .assertHasNoClickAction()
}
@Test
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt
index 7d4afcf..4bd7229 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt
@@ -27,6 +27,7 @@
import androidx.ui.foundation.semantics.toggleableState
import androidx.ui.layout.Column
import androidx.ui.semantics.accessibilityValue
+import androidx.ui.test.assertHasNoClickAction
import androidx.ui.test.assertIsChecked
import androidx.ui.test.assertIsUnchecked
import androidx.ui.test.assertSemanticsIsEqualTo
@@ -116,9 +117,7 @@
}
}
findByTag(defaultSwitchTag)
- .assertIsUnchecked()
- .doClick()
- .assertIsUnchecked()
+ .assertHasNoClickAction()
}
@Test
diff --git a/ui/ui-test/api/1.0.0-alpha01.txt b/ui/ui-test/api/1.0.0-alpha01.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/1.0.0-alpha01.txt
+++ b/ui/ui-test/api/1.0.0-alpha01.txt
@@ -10,6 +10,8 @@
ctor public AssertionsKt();
method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
- method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
}
@@ -60,6 +61,7 @@
public final class FiltersKt {
ctor public FiltersKt();
+ method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
}
diff --git a/ui/ui-test/api/current.txt b/ui/ui-test/api/current.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/current.txt
+++ b/ui/ui-test/api/current.txt
@@ -10,6 +10,8 @@
ctor public AssertionsKt();
method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
- method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
}
@@ -60,6 +61,7 @@
public final class FiltersKt {
ctor public FiltersKt();
+ method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
}
diff --git a/ui/ui-test/api/restricted_1.0.0-alpha01.txt b/ui/ui-test/api/restricted_1.0.0-alpha01.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-test/api/restricted_1.0.0-alpha01.txt
@@ -10,6 +10,8 @@
ctor public AssertionsKt();
method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
- method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
}
@@ -60,6 +61,7 @@
public final class FiltersKt {
ctor public FiltersKt();
+ method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
}
diff --git a/ui/ui-test/api/restricted_current.txt b/ui/ui-test/api/restricted_current.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/restricted_current.txt
+++ b/ui/ui-test/api/restricted_current.txt
@@ -10,6 +10,8 @@
ctor public AssertionsKt();
method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+ method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
- method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
}
@@ -60,6 +61,7 @@
public final class FiltersKt {
ctor public FiltersKt();
+ method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
}
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt b/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
index 08ab6eb..2da48e4 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
@@ -20,7 +20,8 @@
* Performs a click action on the given component.
*/
fun SemanticsNodeInteraction.doClick(): SemanticsNodeInteraction {
- assertStillExists()
+ // TODO(b/129400818): uncomment this after Merge Semantics is merged
+ // assertHasClickAction()
// TODO(catalintudor): get real coordinates after Semantics API is ready (b/125702443)
val globalCoordinates = semanticsTreeNode.globalPosition
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt b/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt
index 7f0debd..e417c4d3 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt
@@ -62,15 +62,6 @@
}
/**
- * Asserts that the component is still part of the component tree.
- */
-fun SemanticsNodeInteraction.assertStillExists() {
- if (!semanticsTreeInteraction.contains(semanticsTreeNode.data)) {
- throw AssertionError("Assert failed: The component does not exist!")
- }
-}
-
-/**
* Asserts that the component isn't part of the component tree anymore. If the component exists but
* is hidden use [assertIsHidden] instead.
*/
@@ -86,10 +77,9 @@
* Throws [AssertionError] if the component is not unchecked, indeterminate, or not toggleable.
*/
fun SemanticsNodeInteraction.assertIsChecked(): SemanticsNodeInteraction {
+ assertIsToggleable()
verify({ "Component is toggled off, expected it to be toggled on" }) {
- it.getOrElse(FoundationSemanticsProperties.ToggleableState) {
- throw AssertionError("Component is not toggleable")
- } == ToggleableState.Checked
+ it[FoundationSemanticsProperties.ToggleableState] == ToggleableState.Checked
}
return this
}
@@ -100,10 +90,9 @@
* Throws [AssertionError] if the component is checked, indeterminate, or not toggleable.
*/
fun SemanticsNodeInteraction.assertIsUnchecked(): SemanticsNodeInteraction {
+ assertIsToggleable()
verify({ "Component is toggled on, expected it to be toggled off" }) {
- it.getOrElse(FoundationSemanticsProperties.ToggleableState) {
- throw AssertionError("Component is not toggleable")
- } == ToggleableState.Unchecked
+ it[FoundationSemanticsProperties.ToggleableState] == ToggleableState.Unchecked
}
return this
@@ -115,10 +104,10 @@
* Throws [AssertionError] if the component is unselected or not selectable.
*/
fun SemanticsNodeInteraction.assertIsSelected(): SemanticsNodeInteraction {
+ assertIsSelectable()
+
verify({ "Component is unselected, expected it to be selected" }) {
- it.getOrElse(FoundationSemanticsProperties.Selected) {
- throw AssertionError("Component is not selectable")
- }
+ it[FoundationSemanticsProperties.Selected]
}
return this
}
@@ -129,10 +118,10 @@
* Throws [AssertionError] if the component is selected or not selectable.
*/
fun SemanticsNodeInteraction.assertIsUnselected(): SemanticsNodeInteraction {
+ assertIsSelectable()
+
verify({ "Component is selected, expected it to be unselected" }) {
- !it.getOrElse(FoundationSemanticsProperties.Selected) {
- throw AssertionError("Component is not selectable")
- }
+ !it[FoundationSemanticsProperties.Selected]
}
return this
}
@@ -173,14 +162,40 @@
fun SemanticsNodeInteraction.assertSemanticsIsEqualTo(
expectedProperties: SemanticsConfiguration
): SemanticsNodeInteraction {
- assertStillExists()
+ assertExists()
semanticsTreeNode.data.assertEquals(expectedProperties)
return this
}
/**
- * Asserts that given a list of components, it's size is equal to the passed in size.
+ * Asserts that the current component has a click action.
+ *
+ * Throws [AssertionError] if the component is doesn't have a click action.
+ */
+fun SemanticsNodeInteraction.assertHasClickAction(): SemanticsNodeInteraction {
+ verify({ "Component is not clickable, expected it to be clickable" }) {
+ it.hasClickAction
+ }
+
+ return this
+}
+
+/**
+ * Asserts that the current component doesn't have a click action.
+ *
+ * Throws [AssertionError] if the component has a click action.
+ */
+fun SemanticsNodeInteraction.assertHasNoClickAction(): SemanticsNodeInteraction {
+ verify({ "Component is clickable, expected it to not be clickable" }) {
+ !it.hasClickAction
+ }
+
+ return this
+}
+
+/**
+ * Asserts that given a list of components, its size is equal to the passed in size.
*/
fun List<SemanticsNodeInteraction>.assertCountEquals(
count: Int
@@ -201,10 +216,45 @@
assertionMessage: (SemanticsConfiguration) -> String,
condition: (SemanticsConfiguration) -> Boolean
) {
- assertStillExists()
+ assertExists()
if (!condition.invoke(semanticsTreeNode.data)) {
// TODO(b/133217292)
throw AssertionError("Assert failed: ${assertionMessage(semanticsTreeNode.data)}")
}
}
+
+/**
+ * Asserts that the component is still part of the component tree.
+ */
+internal fun SemanticsNodeInteraction.assertExists() {
+ if (!semanticsTreeInteraction.contains(semanticsTreeNode.data)) {
+ throw AssertionError("The component does not exist!")
+ }
+}
+
+/**
+ * Asserts that the current component is toggleable.
+ *
+ * Throws [AssertionError] if the component is not toggleable.
+ */
+internal fun SemanticsNodeInteraction.assertIsToggleable(): SemanticsNodeInteraction {
+ verify({ "Component is not toggleable, expected it to be toggleable" }) {
+ it.isToggleable
+ }
+
+ return this
+}
+
+/**
+ * Asserts that the current component is selectable.
+ *
+ * Throws [AssertionError] if the component is not selectable.
+ */
+internal fun SemanticsNodeInteraction.assertIsSelectable(): SemanticsNodeInteraction {
+ verify({ "Component is not selectable, expected it to be selectable" }) {
+ it.getOrNull(FoundationSemanticsProperties.Selected) != null
+ }
+
+ return this
+}
\ No newline at end of file
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt b/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
index 3f3d8cb..3827927 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
@@ -19,6 +19,7 @@
import androidx.ui.core.semantics.SemanticsConfiguration
import androidx.ui.core.semantics.getOrNull
import androidx.ui.foundation.semantics.FoundationSemanticsProperties
+import androidx.ui.semantics.SemanticsActions
/**
* Verifies that a component is checkable.
@@ -26,6 +27,9 @@
val SemanticsConfiguration.isToggleable: Boolean
get() = contains(FoundationSemanticsProperties.ToggleableState)
+val SemanticsConfiguration.hasClickAction: Boolean
+ get() = SemanticsActions.OnClick in this
+
// TODO(ryanmentley/pavlis): Do we want these convenience functions?
/**
* Verifies that a component is in a mutually exclusive group - that is,
diff --git a/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt b/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt
index deb6f9c..c487f67 100644
--- a/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt
+++ b/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt
@@ -25,10 +25,9 @@
import com.google.common.truth.Truth
import org.junit.Test
-// TODO(b/138167927): findByTag_* tests do not call findByTag
class FindersTests {
@Test
- fun findByTag_zeroOutOfOne_findsNone() {
+ fun findAll_zeroOutOfOne_findsNone() {
semanticsTreeInteractionFactory = { selector ->
FakeSemanticsTreeInteraction(selector)
.withSemantics(newNode(
@@ -43,7 +42,7 @@
}
@Test
- fun findByTag_oneOutOfTwo_findsOne() {
+ fun findAll_oneOutOfTwo_findsOne() {
val node1 = newNode(SemanticsConfiguration().apply {
testTag = "myTestTag"
})
@@ -61,7 +60,7 @@
}
@Test
- fun findByTag_twoOutOfTwo_findsTwo() {
+ fun findAll_twoOutOfTwo_findsTwo() {
val node1 = newNode(
SemanticsConfiguration().apply {
testTag = "myTestTag"
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
index 4ada2e9..2c0ffe6 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
@@ -56,9 +56,9 @@
// @Test
// fun preferredLineHeight_style_not_set() {
// val defaultTextStyle = TextStyle(fontFamily = fontFamily)
-// val textPainter = TextDelegate(style = defaultTextStyle)
+// val textDelegate = TextDelegate(style = defaultTextStyle)
//
-// val prefferedHeight = textPainter.preferredLineHeight
+// val prefferedHeight = textDelegate.preferredLineHeight
//
// assertThat(prefferedHeight).isEqualTo(14.0)
// }
@@ -72,16 +72,16 @@
text = text,
textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
- assertThat(textPainter.minIntrinsicWidth).isEqualTo(0.0f)
+ assertThat(textDelegate.minIntrinsicWidth).isEqualTo(0.0f)
}
@Test
@@ -100,16 +100,18 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
- assertThat(textPainter.maxIntrinsicWidth).isEqualTo(fontSize.toPx().value * text.length)
+ assertThat(
+ textDelegate.maxIntrinsicWidth).isEqualTo(fontSize.toPx().value * text.length
+ )
}
}
@@ -129,16 +131,16 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints(0.ipx, 200.ipx))
+ textDelegate.layout(Constraints(0.ipx, 200.ipx))
- assertThat(textPainter.width).isEqualTo(fontSize.toPx().value * text.length)
+ assertThat(textDelegate.width).isEqualTo(fontSize.toPx().value * text.length)
}
}
@@ -151,16 +153,16 @@
text = text,
textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints(maxWidth = width))
+ textDelegate.layout(Constraints(maxWidth = width))
- assertThat(textPainter.width).isEqualTo(width.value.toFloat())
+ assertThat(textDelegate.width).isEqualTo(width.value.toFloat())
}
@Test
@@ -179,31 +181,31 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
- assertThat(textPainter.height).isEqualTo(fontSize.toPx().value)
+ assertThat(textDelegate.height).isEqualTo(fontSize.toPx().value)
}
}
@Test
fun layout_build_layoutResult() {
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = AnnotatedString(text = "Hello"),
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints(0.ipx, 20.ipx))
+ textDelegate.layout(Constraints(0.ipx, 20.ipx))
- assertThat(textPainter.layoutResult).isNotNull()
+ assertThat(textDelegate.layoutResult).isNotNull()
}
@Test
@@ -219,15 +221,15 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
- val selection = textPainter.getOffsetForPosition(PxPosition.Origin)
+ val selection = textDelegate.getOffsetForPosition(PxPosition.Origin)
assertThat(selection).isEqualTo(0)
}
@@ -248,15 +250,15 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
- val selection = textPainter.getOffsetForPosition(
+ val selection = textDelegate.getOffsetForPosition(
position = PxPosition((fontSize.toPx().value * characterIndex + 1).px, 0.px)
)
@@ -272,16 +274,16 @@
text = text,
textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
- assertThat(textPainter.hasVisualOverflow).isFalse()
+ assertThat(textDelegate.hasVisualOverflow).isFalse()
}
@Test
@@ -295,7 +297,7 @@
text = text,
textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
overflow = TextOverflow.Fade,
@@ -305,9 +307,9 @@
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints(maxWidth = 100.ipx))
+ textDelegate.layout(Constraints(maxWidth = 100.ipx))
- assertThat(textPainter.hasVisualOverflow).isTrue()
+ assertThat(textDelegate.hasVisualOverflow).isTrue()
}
@Test
@@ -321,7 +323,7 @@
text = text,
textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
overflow = TextOverflow.Fade,
@@ -330,9 +332,9 @@
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints(maxWidth = 100.ipx))
+ textDelegate.layout(Constraints(maxWidth = 100.ipx))
- assertThat(textPainter.hasVisualOverflow).isTrue()
+ assertThat(textDelegate.hasVisualOverflow).isTrue()
}
@Test
@@ -353,17 +355,17 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints(maxWidth = 120.ipx))
+ textDelegate.layout(Constraints(maxWidth = 120.ipx))
val expectedBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val expectedCanvas =
@@ -372,10 +374,10 @@
val defaultSelectionColor = Color(0x6633B5E5)
expectedPaint.color = defaultSelectionColor
- val firstLineLeft = textPainter.layoutResult?.multiParagraph?.getLineLeft(0)
- val secondLineLeft = textPainter.layoutResult?.multiParagraph?.getLineLeft(1)
- val firstLineRight = textPainter.layoutResult?.multiParagraph?.getLineRight(0)
- val secondLineRight = textPainter.layoutResult?.multiParagraph?.getLineRight(1)
+ val firstLineLeft = textDelegate.layoutResult?.multiParagraph?.getLineLeft(0)
+ val secondLineLeft = textDelegate.layoutResult?.multiParagraph?.getLineLeft(1)
+ val firstLineRight = textDelegate.layoutResult?.multiParagraph?.getLineRight(0)
+ val secondLineRight = textDelegate.layoutResult?.multiParagraph?.getLineRight(1)
expectedCanvas.drawRect(
Rect(firstLineLeft!!, 0f, firstLineRight!!, fontSizeInPx),
expectedPaint
@@ -385,21 +387,21 @@
secondLineLeft!!,
fontSizeInPx,
secondLineRight!!,
- textPainter.layoutResult!!.multiParagraph.height
+ textDelegate.layoutResult!!.multiParagraph.height
),
expectedPaint
)
val actualBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
// Run.
// Select all.
- textPainter.paintBackground(
+ textDelegate.paintBackground(
start = 0,
end = text.length,
color = defaultSelectionColor,
@@ -431,17 +433,17 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
val expectedBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val expectedCanvas =
@@ -460,14 +462,14 @@
)
val actualBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
// Run.
- textPainter.paintBackground(
+ textDelegate.paintBackground(
start = selectionStart,
end = selectionEnd,
color = defaultSelectionColor,
@@ -502,17 +504,17 @@
)
)
)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
val expectedBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val expectedCanvas =
@@ -543,14 +545,14 @@
)
val actualBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
// Run.
- textPainter.paintBackground(
+ textDelegate.paintBackground(
start = selectionLTRStart,
end = textLTR.length + selectionRTLEnd,
color = defaultSelectionColor,
@@ -583,17 +585,17 @@
)
)
val selectionColor = Color(0x66AABB33)
- val textPainter = TextDelegate(
+ val textDelegate = TextDelegate(
text = annotatedString,
paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
density = density,
resourceLoader = resourceLoader
)
- textPainter.layout(Constraints())
+ textDelegate.layout(Constraints())
val expectedBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val expectedCanvas =
@@ -611,14 +613,14 @@
)
val actualBitmap = Bitmap.createBitmap(
- ceil(textPainter.width).toInt(),
- ceil(textPainter.height).toInt(),
+ ceil(textDelegate.width).toInt(),
+ ceil(textDelegate.height).toInt(),
Bitmap.Config.ARGB_8888
)
val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
// Run.
- textPainter.paintBackground(
+ textDelegate.paintBackground(
start = selectionStart,
end = selectionEnd,
color = selectionColor,
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt b/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
index 48e7883..1287346 100644
--- a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
@@ -50,7 +50,7 @@
private val DefaultFontSize: Sp = 14.sp
/**
- * Resolve text style to be able to pass underlying paragraphs.
+ * Resolve text style to be able to pass to underlying paragraphs.
*
* We need to pass non-null font size to underlying paragraph.
*/
@@ -143,7 +143,7 @@
/**
* The paragraph style.
*
- * If null is passed to constructor, use default paragraph style is used.
+ * If null is passed to constructor, use default paragraph style.
*/
val paragraphStyle: ParagraphStyle = paragraphStyle ?: ParagraphStyle()
diff --git a/viewpager/build.gradle b/viewpager/build.gradle
index 2559de8..f1f7e65 100644
--- a/viewpager/build.gradle
+++ b/viewpager/build.gradle
@@ -17,7 +17,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
api(project(":customview"))
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/viewpager2/build.gradle b/viewpager2/build.gradle
index 9c933df..6cda3c8 100644
--- a/viewpager2/build.gradle
+++ b/viewpager2/build.gradle
@@ -27,9 +27,9 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- implementation("androidx.core:core:1.1.0-rc01")
+ implementation("androidx.core:core:1.1.0")
api("androidx.fragment:fragment:1.1.0-rc01")
- api("androidx.recyclerview:recyclerview:1.1.0-beta01")
+ api(project(":recyclerview:recyclerview"))
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/webkit/build.gradle b/webkit/build.gradle
index 8c0c18d..622bf29 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -26,7 +26,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api("androidx.core:core:1.1.0")
androidTestImplementation(OKHTTP_MOCKWEBSERVER)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java b/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java
index 72dae3d..8e2d65f 100644
--- a/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java
+++ b/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java
@@ -34,7 +34,8 @@
import java.util.zip.GZIPInputStream;
/**
- * Handles opening resources and assets.
+ * A Utility class for opening resources, assets and files for
+ * {@link androidx.webkit.WebViewAssetLoader}.
* Forked from the chromuim project org.chromium.android_webview.AndroidProtocolHandler
*/
public class AssetHelper {
@@ -73,9 +74,9 @@
return path;
}
- private int getFieldId(@NonNull String assetType, @NonNull String assetName) {
+ private int getFieldId(@NonNull String resourceType, @NonNull String resourceName) {
String packageName = mContext.getPackageName();
- int id = mContext.getResources().getIdentifier(assetName, assetType, packageName);
+ int id = mContext.getResources().getIdentifier(resourceName, resourceType, packageName);
return id;
}
@@ -89,29 +90,32 @@
* Open an InputStream for an Android resource.
*
* @param path Path of the form "resource_type/resource_name.ext".
- * @return An InputStream to the Android resource.
+ * @return An {@link InputStream} to the Android resource or {@code null} if it cannot open the
+ * resource file.
*/
@Nullable
public InputStream openResource(@NonNull String path) {
path = removeLeadingSlash(path);
- // The path must be of the form "asset_type/asset_name.ext".
+ // The path must be of the form "resource_type/resource_name.ext".
String[] pathSegments = path.split("/");
if (pathSegments.length != 2) {
Log.e(TAG, "Incorrect resource path: " + path);
return null;
}
- String assetType = pathSegments[0];
- String assetName = pathSegments[1];
+ String resourceType = pathSegments[0];
+ String resourceName = pathSegments[1];
// Drop the file extension.
- assetName = assetName.split("\\.")[0];
+ resourceName = resourceName.split("\\.")[0];
try {
- int fieldId = getFieldId(assetType, assetName);
+ int fieldId = getFieldId(resourceType, resourceName);
int valueType = getValueType(fieldId);
if (valueType == TypedValue.TYPE_STRING) {
return handleSvgzStream(path, mContext.getResources().openRawResource(fieldId));
} else {
- Log.e(TAG, "Asset not of type string: " + path);
+ Log.e(TAG,
+ String.format("Expected %s resource to be of TYPE_STRING but was %d",
+ path, valueType));
return null;
}
} catch (Resources.NotFoundException e) {
@@ -124,7 +128,8 @@
* Open an InputStream for an Android asset.
*
* @param path Path to the asset file to load.
- * @return An InputStream to the Android asset.
+ * @return An {@link InputStream} to the Android asset or {@code null} if it cannot open the
+ * asset file.
*/
@Nullable
public InputStream openAsset(@NonNull String path) {
@@ -141,7 +146,7 @@
/**
* Open an {@code InputStream} for a file in application data directories.
*
- * @param file The the file to be opened.
+ * @param file The file to be opened.
* @return An {@code InputStream} for the requested file or {@code null} if an error happens.
*/
@Nullable